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)
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 {
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
.
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;
}
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.
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);
Sie müssen möglicherweise getActivity () durch MainActivity.this ersetzen, wenn Sie Probleme damit haben.
mit Kotlin führe ich diesen Code aus:
requireContext().startActivity<YourTargetActivity>()