Wie Implementieren OnFragmentInteractionListener

? Mario M @ | Original: StackOverFlow
---

Ich habe eine Schublade mit der Navigation in android Studio 0.8.2 app erzeugt Assistenten

Ich habe ein Fragment mit newInstance (erstellt und hinzugefügt ) und ich bekomme diese Fehlermeldung:

com.domain.myapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.ClassCastException: 
com.domain.myapp.MainActivity@422fb8f0 
must implement OnFragmentInteractionListener

Ich kann es nicht überall zu finden, wie man diese OnFragmentInteractionListener umzusetzen ?? Es kann auch nicht in android sdk -Dokumentation !

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));
    }
}

}

---

Top 5 Antwort

1Larry Schiefer @

Lesen Sie automatisch generierten Fragment von Android Studio erstellt. Wenn Sie die neue Fragment erstellt, drückte Studio eine Reihe von Code für Sie . An der Unterseite des automatisch generierten Vorlage gibt es eine innere Schnittstellendefinition genannten OnFragmentInteractionListener . Ihre Activity muss diese Schnittstelle implementieren . Dies ist die empfohlene Muster für Ihre Fragment zu benachrichtigen Ihren Activity der Ereignisse, damit es dann entsprechende Maßnahmen ergreifen, wie Last anderen Fragment . Sehen Sie diese Seite für Details, suchen Sie nach den "Erstellen Ereignisrückrufe für die Aktivität" Abschnitt : http://developer.android.com/guide/components/fragments.html

2Bwvolleyball @

Für diejenigen unter Ihnen, die diese Seite auf der Suche nach weiteren Klärung zu diesem Fehler finden Sie, die Tätigkeit, die den Anruf an das Fragment muss zwei Geräte in diesem Fall müssen, wie folgt aus:

public class MyActivity extends Activity implements MyFragment.OnFragmentInteractionListener, NavigationDrawerFragment.NaviationDrawerCallbacks {
...// rest of the code
}

Ich bin dieses Posting, weil ich immer die exakt gleichen Fehler, konnte aber die Antwort oben, bis es wurde für mich zu klären nicht verstehen . Ich wollte, dass es für andere zugänglich zu machen.

3Ahmed Daou @

Antworten hier gepostet hat nicht geholfen, aber die folgenden Link haben :

http://developer.android.com/training/basics/fragments/communicating.html

Define an Interface
public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

Beispielsweise wird das folgende Verfahren in dem Fragment aufgerufen, wenn der Benutzer auf einen Listeneintrag klickt. Das Fragment verwendet die Callback-Schnittstelle, um das Ereignis auf die übergeordnete Aktivität liefern .

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // Send the event to the host activity
    mCallback.onArticleSelected(position);
}
Implement the Interface

Beispielsweise implementiert die folgenden Aktivitäts die Schnittstelle aus dem obigen Beispiel.

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}
4user26409021 @

Für diejenigen unter Ihnen, die noch nicht nach dem Lesen Bwvolleyball Antwort zu verstehen, hier ist meine präzise und vollständige Erklärung für dieses Problem :

Angenommen, Sie haben 2 -Fragmente, Fragment_A und Fragment_B, die automatisch erzeugt aus der App . Am unteren Teil des erzeugten Fragmente, wirst du diesen Code zu finden :

public class Fragment_A extends Fragment {

    //rest of the code is omitted

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }
}
public class Fragment_B extends Fragment {

    //rest of the code is omitted

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }
}

Um das Problem zu überwinden, müssen Sie Methode in Ihre Tätigkeit, die in meinem Fall ist hinzuzufügen onFragmentInteraction MainActivity . Außerdem müssen Sie alle Bruchstücke durch folgenden Code implementiert :

public class MainActivity2 extends ActionBarActivity
        implements Fragment_A.OnFragmentInteractionListener, Fragment_B.OnFragmentInteractionListener, NavigationDrawerFragment.NavigationDrawerCallbacks {

    //rest code is omitted

    public void onFragmentInteraction(Uri uri){
        //you can leave it empty
    }
}

P.S.: In short, this method could be use to communicate between fragments. For those of you who want to know more about this method, please refer to this http://developer.android.com/training/basics/fragments/communicating.html.