Ich habe eine vom Assistenten generierte App mit Navigationsschublade in Android Studio 0.8.2
Ich habe ein Fragment erstellt und es mit newInstance () hinzugefügt und erhalte folgende Fehlermeldung:
com.domain.myapp E / AndroidRuntime ﹕ FATAL EXCEPTION: main java.lang.ClassCastException: com.domain.myapp.MainActivity@422fb8f0 muss OnFragmentInteractionListener implementieren
Ich kann nirgendwo finden, wie ich diesen OnFragmentInteractionListener implementieren soll? Es kann nicht einmal in der Android SDK-Dokumentation gefunden werden!
MainActivity.java
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
public class MainActivity extends Activity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getFragmentManager();
switch (position) {
case 0: fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit(); break;
case 1: fragmentManager.beginTransaction()
.replace(R.id.container, AboutFragment.newInstance("test1", "test2"))
.commit(); break; // this crashes the app
case 2: fragmentManager.beginTransaction()
.replace(R.id.container, BrowseQuotesFragment.newInstance("test1", "test2"))
.commit(); break; // this crashes the app
}
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.title_section1);
break;
case 2:
mTitle = getString(R.string.title_section2);
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
getMenuInflater().inflate(R.menu.main, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
}}
quelle
onAttach(Activity activity);
veraltet und ersetzt durchonAttach(Context context)
onAttach(context)
würde gut funktionierenFür diejenigen unter Ihnen, die nach dem Lesen der @ meda-Antwort immer noch nichts verstehen, ist hier meine kurze und vollständige Erklärung für dieses Problem:
Angenommen , Sie haben zwei Fragmente haben,
Fragment_A
undFragment_B
das sind automatisch generiert aus der App. Im unteren Teil Ihrer generierten Fragmente finden Sie diesen Code:Um das Problem zu beheben, müssen Sie
onFragmentInteraction
Ihrer Aktivität eine Methode hinzufügen , die in meinem Fall benannt istMainActivity2
. Danach müssen Sieimplements
alle FragmenteMainActivity
wie folgt bearbeiten:PS: Kurz gesagt, diese Methode könnte für die Kommunikation zwischen Fragmenten verwendet werden. Für diejenigen unter Ihnen, die mehr über diese Methode erfahren möchten, klicken Sie bitte auf diesen Link .
quelle
onFragmentIntereactior(Uri)
Methode implementieren , die in keiner der anderen Antworten erwähnt wird. +1Sehen Sie sich Ihre automatisch generierte
Fragment
, von Android Studio erstellte Version an. Als Sie das neue erstellt habenFragment
, hat Studio eine Menge Code für Sie erstellt. Am unteren Rand der automatisch generierten Vorlage befindet sich eine innere Schnittstellendefinition namensOnFragmentInteractionListener
. SieActivity
müssen diese Schnittstelle implementieren. Dies ist das empfohlene Muster, mit dem SieFragment
IhreActivity
Ereignisse benachrichtigen können , damit sie geeignete Maßnahmen ergreifen können, z. B. ein anderes ladenFragment
. Weitere Informationen finden Sie auf dieser Seite im Abschnitt "Erstellen von Ereignisrückrufen für die Aktivität": http://developer.android.com/guide/components/fragments.htmlquelle
Activity
angehängt istFragment
. Der Absturz, den Sie sehen, ist, weil SieActivity
die Schnittstelle nicht implementiert haben. Sie müssen in Ihre gehenActivity
und eineimplements YourFragment.OnFragmentInteractionListener
hinzufügen und dann eine Implementierung der in der Schnittstelle definierten Methode hinzufügen.onFragmentInteraction(Uri uri)
ist nur ein Stich. Sie können diese Methode beliebig gestalten undActivity
müssen sie implementieren. Sehen Sie, ob dies hilft.Für diejenigen unter Ihnen, die diese Seite besuchen und nach weiteren Erläuterungen zu diesem Fehler suchen, musste in meinem Fall die Aktivität, mit der das Fragment aufgerufen wird, in diesem Fall über zwei Geräte verfügen:
quelle
Sie sollten versuchen, den folgenden Code aus Ihren Fragmenten zu entfernen
Die Schnittstelle / der Listener ist eine Standardeinstellung, die erstellt wurde, damit Ihre Aktivitäten und Fragmente einfacher kommunizieren können
quelle
Zusätzlich zur Antwort von @ user26409021 lautet die Meldung im ItemFragment: Wenn Sie ein ItemFragment hinzugefügt haben;
Und Sie sollten in Ihrer Aktivität hinzufügen;
Hier ist der Dummy-Gegenstand das, was Sie unten in Ihrem ItemFragment haben
quelle
Bei mir hat es geklappt diesen Code zu löschen:
So enden:
quelle
OnFragmentInteractionListener
ist die Standardimplementierung für die Verarbeitung der Kommunikation zwischen Fragmenten und Aktivitäten. Dies kann je nach Bedarf implementiert werden. Angenommen, Sie benötigen eine Funktion in Ihrer Aktivität, die während einer bestimmten Aktion in Ihrem Fragment ausgeführt werden soll, und können diese Rückrufmethode verwenden. Wenn Sie diese Interaktion zwischen Ihrem Hostingactivity
und nicht benötigenfragment
, können Sie diese Implementierung entfernen.Kurz gesagt, Sie sollten
implement
den Listener in Ihrer Fragment-Hosting-Aktivität, wenn Sie die Fragment-Aktivitäts-Interaktion wie diese benötigenund Ihr Fragment sollte es so definiert haben
Geben Sie auch eine Definition für
void onFragmentInteraction(Uri uri);
Ihre Aktivität anOder entfernen Sie einfach die
listener
Initialisierung aus Ihrem Fragment,onAttach
wenn Sie keine Interaktion zwischen Fragment und Aktivität habenquelle
Verwenden Sie anstelle von Aktivität den Kontext. Es funktioniert für mich.
quelle
Nur ein Nachtrag:
OnFragmentInteractionListener verwaltet die Kommunikation zwischen Aktivität und Fragment über eine Schnittstelle (OnFragmentInteractionListener) und wird standardmäßig von Android Studio erstellt. Wenn Sie jedoch nicht mit Ihrer Aktivität kommunizieren müssen, können Sie einfach loslegen .
Das Ziel ist, dass Sie Ihr Fragment an mehrere Aktivitäten anhängen und dennoch denselben Kommunikationsansatz wiederverwenden können (jede Aktivität kann für jedes Fragment einen eigenen OnFragmentInteractionListener haben).
Aber und wenn ich sicher bin, dass mein Fragment nur an eine Art von Aktivität gebunden ist und ich mit dieser Aktivität kommunizieren möchte?
Wenn Sie OnFragmentInteractionListener aufgrund seiner Ausführlichkeit nicht verwenden möchten, können Sie auf Ihre Aktivitätsmethoden zugreifen, indem Sie:
quelle
Gehen Sie einfach zu Ihrer Fragmentaktivität und entfernen Sie alle Methoden ..... stattdessen auf createview-Methode.
Ihr Fragment hat nur die Methode oncreateview, die es ist.
// Nur diese Methode implementiert eine andere Methode zum Löschen
und stellen Sie sicher, dass Ihr Layout eine Demo für Sie ist.
quelle
Ich möchte die Zerstörung des Listeners hinzufügen, wenn das Fragment von der Aktivität getrennt oder zerstört wird.
und bei Verwendung der neuen onStart () -Methode mit Context
quelle