J'ai une application générée par un assistant avec un tiroir de navigation dans Android Studio 0.8.2
J'ai créé un fragment et l'ai ajouté avec newInstance () et j'obtiens cette erreur:
com.domain.myapp E / AndroidRuntime ﹕ FATAL EXCEPTION: main java.lang.ClassCastException: com.domain.myapp.MainActivity@422fb8f0 doit implémenter OnFragmentInteractionListener
Je ne trouve nulle part comment implémenter ce OnFragmentInteractionListener ?? Il ne peut pas être trouvé même dans la documentation android sdk!
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));
}
}
}
la source
onAttach(Activity activity);
est obsolète et remplacé paronAttach(Context context)
onAttach(context)
fonctionnerait bienPour ceux d'entre vous qui ne comprennent toujours pas après avoir lu la réponse @meda, voici mon explication concise et complète de ce problème:
Disons que vous avez 2 fragments,
Fragment_A
etFragment_B
qui sont générés automatiquement à partir de l'application. Sur la partie inférieure de vos fragments générés, vous allez trouver ce code:Pour surmonter le problème, vous devez ajouter une
onFragmentInteraction
méthode à votre activité, qui dans mon cas est nomméeMainActivity2
. Après cela, vous devezimplements
tous les fragments de la manièreMainActivity
suivante:PS: En bref, cette méthode pourrait être utilisée pour communiquer entre fragments. Pour ceux d'entre vous qui souhaitent en savoir plus sur cette méthode, veuillez consulter ce lien .
la source
onFragmentIntereactior(Uri)
méthode, qui est mentionné dans aucun des autres réponses. +1Consultez votre
Fragment
création automatique créée par Android Studio. Lorsque vous avez créé le nouveauFragment
, Studio a écrasé un tas de code pour vous. Au bas du modèle généré automatiquement, il y a une définition d'interface interne appeléeOnFragmentInteractionListener
. VosActivity
besoins pour implémenter cette interface. Il s'agit du modèle recommandé pour que vousFragment
vous informiezActivity
des événements afin qu'il puisse ensuite prendre les mesures appropriées, comme en charger un autreFragment
. Consultez cette page pour plus de détails, recherchez la section "Création de rappels d'événements pour l'activité": http://developer.android.com/guide/components/fragments.htmlla source
Activity
est attaché auFragment
. Le crash que vous voyez est dû au fait que vous n'avezActivity
pas implémenté l'interface. Vous devez aller dans votreActivity
et ajouter unimplements YourFragment.OnFragmentInteractionListener
puis ajouter une implémentation de la méthode définie dans l'interface.onFragmentInteraction(Uri uri)
est juste un stub. Vous pouvez faire de cette méthode tout ce que vous voulez et vosActivity
besoins pour la mettre en œuvre. Voyez si cela aide.Pour ceux d'entre vous qui visitent cette page à la recherche de précisions sur cette erreur, dans mon cas, l'activité appelant le fragment nécessitait d'avoir 2 outils dans ce cas, comme ceci:
la source
Vous devriez essayer de supprimer le code suivant de vos fragments
L'interface / écouteur est une valeur par défaut créée pour que votre activité et vos fragments puissent communiquer plus facilement
la source
En plus de la réponse de @ user26409021, si vous avez ajouté un ItemFragment, le message dans ItemFragment est;
Et vous devez ajouter votre activité;
Ici, l'élément factice est ce que vous avez sur le bas de votre ItemFragment
la source
Avec moi, cela a fonctionné, supprimez ce code:
Se terminant comme ça:
la source
OnFragmentInteractionListener
est l'implémentation par défaut pour la gestion de la communication fragment à activité. Cela peut être mis en œuvre en fonction de vos besoins. Supposons que si vous avez besoin qu'une fonction de votre activité soit exécutée pendant une action particulière dans votre fragment, vous pouvez utiliser cette méthode de rappel. Si vous n'avez pas besoin d'avoir cette interaction entre votre hébergementactivity
etfragment
, vous pouvez supprimer cette implémentation.En bref, vous devriez
implement
l'auditeur dans votre activité d'hébergement de fragment si vous avez besoin de l'interaction fragment-activité comme celle-ciet votre fragment devrait l'avoir défini comme ceci
fournissent également une définition pour
void onFragmentInteraction(Uri uri);
votre activitéou bien supprimez simplement l'
listener
initialisation de votre fragmentonAttach
si vous n'avez aucune interaction fragment-activitéla source
Au lieu d'Activité, utilisez le contexte. Cela fonctionne pour moi.
la source
Juste un addendum:
OnFragmentInteractionListener gère la communication entre Activity et Fragment à l'aide d'une interface (OnFragmentInteractionListener) et est créé par défaut par Android Studio, mais si vous n'avez pas besoin de communiquer avec votre activité, vous pouvez simplement en profiter.
L'objectif est que vous puissiez attacher votre fragment à plusieurs activités tout en réutilisant la même approche de communication (chaque activité peut avoir son propre OnFragmentInteractionListener pour chaque fragment).
Mais et si je suis sûr que mon fragment sera attaché à un seul type d'activité et que je souhaite communiquer avec cette activité?
Ensuite, si vous ne souhaitez pas utiliser OnFragmentInteractionListener en raison de sa verbosité, vous pouvez accéder à vos méthodes d'activité en utilisant:
la source
Accédez simplement à votre activité de fragment et supprimez toutes les méthodes ..... à la place de la méthode createview.
votre fragment n'a que sur la méthode oncreateview c'est tout.
// seule cette méthode implémente une autre méthode delete
et assurez-vous que votre mise en page est une démonstration pour vous.
la source
Je voudrais ajouter la destruction de l'auditeur lorsque le fragment est détaché de l'activité ou détruit.
et lors de l'utilisation de la nouvelle méthode onStart () avec Context
la source