it-swarm.com.de

Starten Sie eine Aktivität von einem Fragment aus

Ich habe 2 Fragmente mit einem Button auf beiden Fragmenten. Wenn ich die Taste drücke, möchte ich eine neue Aktivität starten. Aber ich kann es nicht zum Laufen bringen.

Der Fehler erhalte ich: ERROR hier: Typenkonflikt: Konvertierung von mFragmentFavorite in Fragment nicht möglich

Was mache ich falsch?

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;
    }
}

Lieblingsaktivität

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;
    }
}

Wenn FavoriteActivity Fragmente erweitert, ist der Fehler verschwunden. Ich erhalte jedoch einen Fehler bei findViewById(R.id.mainFavorite); und der Fehler ist

Die Methode findViewById (int) ist für den Typ .__ undefiniert. Lieblingsaktivität

BEARBEITEN:

Wenn ich die Schaltfläche im Fragment drücke, um die Aktivität zu starten, stürzt die App ab Dies ist mein 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 in Ihrem Code ist eine FragmentActivity, die nicht mit einer Fragment identisch ist. Das ist der Grund, warum Sie den Typ nicht übereinstimmen. Außerdem sollten Sie niemals new für eine Activity aufrufen, da dies nicht der richtige Start ist.

Wenn Sie eine neue Instanz von mFragmentFavorite starten möchten, können Sie dies über eine Intent tun.

Von einer Fragment:

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

Von einer Activity

Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);

Wenn Sie aFavorite anstelle von mFragmentFavorite starten möchten, müssen Sie nur deren Namen in der erstellten Intent ändern.

Ich empfehle auch, die Klassennamen zu ändern, um genauer zu sein. Etwas mFragmentFavorite aufzurufen, ist unangemessen, da es überhaupt keine Fragment ist. Außerdem beginnen Klassendeklarationen in Java normalerweise mit einem Großbuchstaben. Sie sollten Ihrer Klasse einen Namen geben, etwa FavoriteActivity, um genauer zu sein und den Sprachkonventionen zu entsprechen. Sie müssen die Datei auch in FavoriteActivity.Java umbenennen, wenn Sie sich dafür entscheiden, da Java Klassennamen erfordert, die mit dem Dateinamen übereinstimmen.

UPDATE

Es sieht auch so aus, als hätten Sie tatsächlich gedacht, dassmFragmentFavorite eine Fragment anstelle einer FragmentActivity sein sollte, basierend auf Ihrer Verwendung von onCreateView. Wenn mFragmentFavorite eine Fragment sein soll, ändern Sie die folgende Codezeile:

public class mFragmentFavorite extends FragmentActivity{

Lass das stattdessen lesen:

public class mFragmentFavorite extends Fragment {
204
Michael Celey

Sie sollten getActivity() verwenden, um Aktivitäten aus Fragmenten zu starten

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

Sie sollten Klassen auch mit Caps benennen: MFragmentActivity statt mFragmentActivity.

20
liarspocker

Ich benutze das in meinem 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

Wenn Sie getActivity () verwenden, müssen Sie sicherstellen, dass die aufrufende Aktivität bereits hinzugefügt ist. Wenn in diesem Fall noch keine Aktivität hinzugefügt wurde, erhalten Sie möglicherweise null, wenn Sie getActivity ()aufrufen. 

in solchen Fällen ist getContext () sicher

dann wird der Code zum Starten der Aktivität leicht geändert, z. 

Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);

Activity, Service and Application erweitert die ContextWrapper-Klasse, sodass Sie this oder getContext () oder getApplicationContext () anstelle des ersten Arguments verwenden können.

3
Jayakrishnan PM

Neue Aktivität von einem Fragment aus starten:

Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);

Neue Aktivität aus einer Aktivität heraus starten:

Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
0
Abhay Bhusari

Sie müssen möglicherweise getActivity () durch MainActivity.this ersetzen, wenn Sie Probleme damit haben.

0
ADL

mit Kotlin führe ich diesen Code aus:

requireContext().startActivity<YourTargetActivity>()

0