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)
65
demandé sur cricket_007 2013-03-18 17:32:13

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 {
193
répondu Michael Celey 2018-04-06 00:55:12

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 .

20
répondu liarspocker 2013-03-18 13:50:23

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
répondu Sara Zakizadeh 2014-04-07 08:31:31

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.

3
répondu Jayakrishnan PM 2016-12-01 01:47:13

vous devrez peut-être remplacer getActivity() par MainActivity.pour ceux qui ont des problèmes avec cela.

0
répondu ADL 2018-07-30 03:28:14