Ich habe 2 Fragmente mit auf beiden Fragmenten einen Knopf. Wenn ich die Taste drücke, möchte ich eine neue Aktivität starten. Aber ich kann es nicht zum Laufen bringen.
Der Fehler, den ich erhalte: FEHLER hier: Typkonflikt: Konvertiert nicht von mFragmentFavorite in Fragment
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, aber dann erhalte ich einen Fehler bei findViewById(R.id.mainFavorite);
und der Fehler ist
Die Methode findViewById (int) ist für den Typ FavoriteActivity undefiniert
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)
Fragments
. Zumindest nein in dem Code, den Sie gepostet haben.Antworten:
mFragmentFavorite
In Ihrem Code ist ein,FragmentActivity
was nicht dasselbe ist wie einFragment
. Das ist der Grund, warum Sie die Typinkongruenz erhalten. Außerdem sollten Sie nie rufennew
auf einActivity
als das nicht der richtige Weg ist , einen zu starten.Wenn Sie eine neue Instanz von starten möchten
mFragmentFavorite
, können Sie dies über eineIntent
.Aus einem
Fragment
:Von einem
Activity
Wenn Sie
aFavorite
stattdessen starten möchten,mFragmentFavorite
müssen Sie nur deren Namen in der erstellten ändernIntent
.Außerdem empfehle ich, Ihre Klassennamen zu ändern, um genauer zu sein. Etwas
mFragmentFavorite
anzurufen ist insofern unangemessen, als es überhaupt kein istFragment
. Außerdem beginnen Klassendeklarationen in Java normalerweise mit einem Großbuchstaben. Sie sollten Ihre Klasse so benennenFavoriteActivity
, dass sie genauer ist und den Sprachkonventionen entspricht. Sie müssen die Datei auch in FavoriteActivity.java umbenennen, wenn Sie dies möchten, da Java erfordert, dass Klassennamen mit dem Dateinamen übereinstimmen.AKTUALISIEREN
Es sieht auch so aus, als ob Sie eigentlich beabsichtigt hätten
mFragmentFavorite
, einFragment
statt eines zu sein,FragmentActivity
basierend auf Ihrer Verwendung vononCreateView
. Wenn Sie ein sein möchtenmFragmentFavorite
,Fragment
ändern Sie die folgende Codezeile:Lassen Sie dies stattdessen lesen:
quelle
Fragment
oder einActivity
. Wenn Sie den Code in einer dieser Klassen verwenden, können Sie ihnmContextReference
entwedergetActivity()
fürFragment
oderthis
fürActivity
in der ersten Zeile undthis
für die zweite Zeile ersetzen . Ich werde die Antwort aktualisieren, um klarer zu sein.Fragment
wechseln SiefindViewById
zuv.findViewById
. Es gibt keinefindViewById
Funktion in,Fragment
also müssen SiegetView
zuerst aufrufen und dann darauf aufrufenfindViewById
. In Ihrem Fall haben Sie jedoch bereits Ihre Ansicht inonCreateView
und das wäre Ihre Variablev
.Sie sollten verwenden
getActivity()
, um Aktivitäten aus Fragmenten zu startenAußerdem sollten Sie Klassen mit Großbuchstaben benennen:
MFragmentActivity
anstelle vonmFragmentActivity
.quelle
Wenn Sie getActivity () verwenden , müssen Sie sicherstellen, dass die aufrufende Aktivität bereits hinzugefügt wurde . Wenn in einem solchen Fall 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 wie:
Aktivität, Service und Anwendung erweitern die ContextWrapper-Klasse, sodass Sie diese oder getContext () oder getApplicationContext () anstelle des ersten Arguments verwenden können.
quelle
Ich benutze dies in meinem Fragment.
quelle
Möglicherweise müssen Sie getActivity () durch MainActivity ersetzen. Dies ist für diejenigen, die Probleme damit haben.
quelle
Neue Aktivität aus einem Fragment starten:
Neue Aktivität aus einer Aktivität starten:
quelle
mit Kotlin führe ich diesen Code aus:
requireContext().startActivity<YourTargetActivity>()
quelle