J'ai 2 fragments avec sur les deux fragments un bouton. Lorsque j'appuie sur le bouton, j'aimerais démarrer une nouvelle activité. Mais je ne peux pas le faire fonctionner.
L'erreur que j'obtiens : ERREUR ici: incompatibilité de type: impossible de convertir de 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 étend des fragments, l'erreur a disparu, 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 FavoriteActivity
ÉDITER:
Lorsque j'appuie sur le bouton dans le fragment pour démarrer 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)
Fragments
. Au moins non dans le code que vous avez publié.Réponses:
mFragmentFavorite
dans votre code est unFragmentActivity
qui n'est pas la même chose qu'unFragment
. C'est pourquoi vous obtenez la non-concordance de types. De plus, vous ne devriez jamais faire appelnew
à unActivity
car ce n'est pas la bonne façon d'en démarrer un.Si vous souhaitez démarrer une nouvelle instance de
mFragmentFavorite
, vous pouvez le faire via un fichierIntent
.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 commencer à la
aFavorite
place,mFragmentFavorite
il vous suffit de changer leurs noms dans le fichier crééIntent
.De plus, je recommande de changer les noms de vos classes pour être plus précis. Appeler quelque chose
mFragmentFavorite
est inapproprié dans la mesure où ce n'est pasFragment
du tout. De plus, les déclarations de classe en Java commencent généralement par une majuscule. Vous feriez bien de nommer votre classe par exempleFavoriteActivity
pour être plus précis et conforme aux conventions linguistiques. Vous devrez également renommer le fichier en FavoriteActivity.java si vous choisissez de le faire, car Java exige que les noms de classe correspondent au nom de fichier.MISE À JOUR
En outre, il semble que vous vouliez réellement
mFragmentFavorite
être unFragment
plutôt qu'un enFragmentActivity
fonction de votre utilisation deonCreateView
. Si vous voulezmFragmentFavorite
être un,Fragment
modifiez la ligne de code suivante:public class mFragmentFavorite extends FragmentActivity{
Faites plutôt lire ceci:
public class mFragmentFavorite extends Fragment {
la source
Fragment
ou unActivity
. Si vous utilisez le code à l'intérieur d'une de ces classes, vous pouvez simplement le remplacermContextReference
pargetActivity()
forFragment
outhis
forActivity
sur la première ligne etthis
pour la deuxième ligne. Je mettrai à jour la réponse pour être plus claire.Fragment
changement puisfindViewById
àv.findViewById
. Il n'y a pas defindViewById
fonctionFragment
, vous devez donc d'getView
abord appeler puis appelerfindViewById
cela. Dans votre cas cependant, vous avez déjà votre point de vueonCreateView
et ce serait votre variablev
.Vous devez utiliser
getActivity()
pour lancer des activités à partir de fragmentsIntent intent = new Intent(getActivity(), mFragmentFavorite.class); startActivity(intent);
De plus, vous devriez nommer les classes avec des majuscules:
MFragmentActivity
au lieu demFragmentActivity
.la source
Si vous utilisez getActivity (), vous devez vous assurer que l'activité d'appel est déjà ajoutée . 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 sûr
puis le code de démarrage de 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.
la source
J'utilise ceci 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; }
la source
Vous devrez peut-être remplacer getActivity () par MainActivity.this pour ceux qui rencontrent des problèmes avec cela.
la source
Démarrer une nouvelle activité à partir d'un fragment:
Intent intent = new Intent(getActivity(), TargetActivity.class); startActivity(intent);
Démarrer une nouvelle activité à partir d'une activité:
Intent intent = new Intent(this, TargetActivity.class); startActivity(intent);
la source
avec Kotlin j'exécute ce code:
requireContext().startActivity<YourTargetActivity>()
la source
None of the following functions can be called with the arguments supplied. startActivity(Intent!) defined in android.content.Context startActivity(Intent!, Bundle?) defined in android.content.Context