Démarrer une activité à partir d'un fragment
j'ai 2 fragments avec sur les deux fragments un bouton. Quand j'appuie sur le bouton, j'aimerais commencer une nouvelle activité. Mais je ne peux pas le faire fonctionner.
L'erreur que je reçois: ERREUR ici: incompatibilité de Type: impossible de convertir de mFragmentFavorite de Fragment
Qu'est-ce que je fais de 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;
}
}
FavoriteActivity
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 est partie mais alors 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
EDIT:
quand j'appuie sur le bouton dans le fragment pour démarrer l'activité alors l'application s'écrase 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.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)
5 réponses
mFragmentFavorite
dans votre code est un FragmentActivity
qui n'est pas la même chose qu'un Fragment
. C'est pourquoi vous obtenez l'incompatibilité de type. En outre, vous ne devez jamais appeler new
sur un Activity
comme ce n'est pas la bonne façon d'en Commencer un.
si vous voulez démarrer une nouvelle instance de mFragmentFavorite
, vous pouvez le faire via un Intent
.
à Partir d'un Fragment
:
Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);
à Partir d'un Activity
Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);
si vous voulez commencer aFavorite
au lieu de mFragmentFavorite
alors vous avez seulement besoin de changer leurs noms dans le Intent
créé .
aussi, je recommande de changer vos noms de classe pour être plus précis. Appeler quelque chose mFragmentFavorite
est impropre en ce sens que ce n'est pas du tout un Fragment
. En outre, 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 se conformer aux conventions linguistiques. Vous devrez aussi renommer le fichier pour FavoriteActivity.java si vous choisissez de le faire puisque Java exige que les noms de classe correspondent au nom du fichier.
mise à JOUR
aussi, il semble que vous vouliez réellement que mFragmentFavorite
soit un Fragment
au lieu d'un FragmentActivity
basé sur votre utilisation de onCreateView
. Si vous voulez que mFragmentFavorite
soit un Fragment
, changez la ligne de code suivante:
public class mFragmentFavorite extends FragmentActivity{
faites plutôt ceci lire:
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);
aussi, vous devriez nommer des 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 () alors 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 donc vous pouvez obtenir null quand vous appelez getActivity () 1519100920"
dans de tels cas, les 151920920" getContext() est sécuritaire
alors le code pour commencer l'activité sera légèrement modifié comme,
Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);
de l'Activité, de Service et d'Application s'étend ContextWrapper classe de sorte que vous pouvez utiliser ce ou getContext() ou getcontexteapplication() à la place du premier argument.
vous devrez peut-être remplacer getActivity() par MainActivity.pour ceux qui ont des problèmes avec cela.