web-dev-qa-db-fra.com

Commencer une activité à partir d'un fragment

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)
72
mXX

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 {
204
Michael Celey

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.

20
liarspocker

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;
}
3
Sara Zakizadeh

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.

3
Jayakrishnan PM

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);
0
Abhay Bhusari

Vous devrez peut-être remplacer getActivity () par MainActivity.this pour ceux qui rencontrent des problèmes.

0
ADL

avec Kotlin j'exécute ce code:

requireContext().startActivity<YourTargetActivity>()

0
Alexandr Kolesnik