J'ai 2 fragments avec sur les deux fragments un bouton. Lorsque j'appuie sur le bouton, je souhaite commencer une nouvelle activité. Mais je ne peux pas le faire fonctionner.
L'erreur que j'obtiens: ERREUR ici: Type mismatch: impossible de convertir mFragmentFavorite en fragment
Qu'est-ce que je fais mal?
MyFragmentPagerAdapter
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentManager;
import Android.support.v4.app.FragmentPagerAdapter;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{
final int PAGE_COUNT = 3;
/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int arg0) {
switch(arg0){
case 0:
return new FavoriteActivity();
//ERROR: Type mismatch: cannot convert from FavoriteActivity to Fragment
case 1:
return new SettingsActivity();
default:
return null;
}
}
/** Returns the number of pages */
@Override
public int getCount() {
return PAGE_COUNT;
}
}
Activité favorite
import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.view.ViewGroup;
import Android.widget.Button;
public class FavoriteActivity extends Activity{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main_favorite, container, false);
OnClickListener listnr=new OnClickListener() {
@Override
public void onClick(View v) {
Intent i= new Intent("aFavorite");
startActivity(i);
}
};
Button btn =(Button) v.findViewById(R.id.mainFavorite);
btn.setOnClickListener(listnr);
return v;
}
}
Si FavoriteActivity prolonge des fragments, l'erreur disparaît mais j'obtiens une erreur à findViewById(R.id.mainFavorite);
et l'erreur est
La méthode findViewById (int) n'est pas définie pour le type Activité favorite
MODIFIER:
Lorsque j'appuie sur le bouton du fragment pour lancer l'activité, l'application se bloque C'est mon logcat
03-18 16:01:23.985: E/AndroidRuntime(1985): FATAL EXCEPTION: main
03-18 16:01:23.985: E/AndroidRuntime(1985): Android.content.ActivityNotFoundException: No Activity found to handle Intent { act=FavoriteActivityList }
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.app.Instrumentation.checkStartActivityResult(Instrumentation.Java:1569)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1420)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.app.Activity.startActivityForResult(Activity.Java:3446)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.app.Activity.startActivityForResult(Activity.Java:3407)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.Java:826)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.support.v4.app.Fragment.startActivity(Fragment.Java:838)
03-18 16:01:23.985: E/AndroidRuntime(1985): at com.example.spui.FavoriteActivity$1.onClick(FavoriteActivity.Java:24)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.view.View.performClick(View.Java:4211)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.view.View$PerformClick.run(View.Java:17267)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.os.Handler.handleCallback(Handler.Java:615)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.os.Handler.dispatchMessage(Handler.Java:92)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.os.Looper.loop(Looper.Java:137)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Android.app.ActivityThread.main(ActivityThread.Java:4898)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Java.lang.reflect.Method.invokeNative(Native Method)
03-18 16:01:23.985: E/AndroidRuntime(1985): at Java.lang.reflect.Method.invoke(Method.Java:511)
03-18 16:01:23.985: E/AndroidRuntime(1985): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1006)
03-18 16:01:23.985: E/AndroidRuntime(1985): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:773)
03-18 16:01:23.985: E/AndroidRuntime(1985): at dalvik.system.NativeStart.main(Native Method)
mFragmentFavorite
dans votre code est une FragmentActivity
qui n'est pas la même chose qu'un Fragment
. C'est pourquoi vous obtenez l'inadéquation des types. En outre, vous ne devriez jamais appeler new
sur une Activity
car ce n’est pas la bonne façon de la démarrer.
Si vous souhaitez démarrer une nouvelle instance de mFragmentFavorite
, vous pouvez le faire via une Intent
.
D'un Fragment
:
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
D'un Activity
Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);
Si vous voulez démarrer aFavorite
au lieu de mFragmentFavorite
, il vous suffit de changer leur nom dans la Intent
créée.
Aussi, je recommande de changer vos noms de classe pour être plus précis. Appeler quelque chose mFragmentFavorite
est impropre dans la mesure où ce n'est pas du tout Fragment
. De plus, les déclarations de classe en Java commencent généralement par une lettre majuscule. Vous feriez bien de nommer votre classe quelque chose comme FavoriteActivity
pour être plus précis et conforme aux conventions de langage. Vous devrez également renommer le fichier FavoriteActivity.Java si vous choisissez de le faire, car Java requiert que les noms de classe correspondent au nom de fichier.
METTRE À JOUR
En outre, il semblerait que vous vouliez réellement que mFragmentFavorite
soit une Fragment
au lieu d'une FragmentActivity
, selon votre utilisation de onCreateView
. Si vous souhaitez que mFragmentFavorite
soit Fragment
, modifiez la ligne de code suivante:
public class mFragmentFavorite extends FragmentActivity{
Faites ceci lire à la place:
public class mFragmentFavorite extends Fragment {
Vous devez utiliser getActivity()
pour lancer des activités à partir de fragments.
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
De plus, vous devriez nommer les classes avec des majuscules: MFragmentActivity
au lieu de mFragmentActivity
.
Je l'utilise dans mon fragment.
Button btn1 = (Button) thisLayout
.findViewById(R.id.btnDb1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getActivity(), otherActivity.class);
((MainActivity) getActivity()).startActivity(intent);
}
});
return thisLayout;
}
Si vous utilisez getActivity () _, vous devez vous assurer que l'activité d'appel est déjà ajouté_. Si l'activité n'a pas été ajoutée dans ce cas, vous pouvez obtenir null lorsque vous appelez getActivity ()
dans de tels cas, getContext () est en sécurité
alors le code pour démarrer l'activité sera légèrement modifié comme,
Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);
Activity, Service and Application étend la classe ContextWrapper afin que vous puissiez utiliser this ou getContext () ou getApplicationContext () à la place du premier argument.
Commencer une nouvelle activité à partir d'un fragment:
Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);
Commencer une nouvelle activité à partir d'une activité:
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
Vous devrez peut-être remplacer getActivity () par MainActivity.this pour ceux qui rencontrent des problèmes.
avec Kotlin j'exécute ce code:
requireContext().startActivity<YourTargetActivity>()