Mam 2 fragmenty z przyciskiem na obu fragmentach. Po naciśnięciu przycisku chcę rozpocząć nowe działanie. Ale nie mogę zmusić tego do pracy.
Błąd, który otrzymuję: BŁĄD tutaj: Niezgodność typu: nie można przekonwertować z mFragmentFavorite na fragment
Co ja robię źle?
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;
}
}
Ulubiona aktywność
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;
}
}
Jeśli FavouriteActivity rozszerza fragmenty, błąd zniknął, ale pojawia się błąd w miejscu findViewById(R.id.mainFavorite);
i błąd jest
Metoda findViewById (int) jest niezdefiniowana dla typu FavoriteActivity
EDYTOWAĆ:
Kiedy naciskam przycisk we fragmencie, aby rozpocząć działanie, aplikacja ulega awarii, to jest mój 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
. Przynajmniej nie w opublikowanym kodzie.Odpowiedzi:
mFragmentFavorite
w twoim kodzie jest a,FragmentActivity
który nie jest tym samym coFragment
. Dlatego otrzymujesz niezgodność typu. Ponadto nigdy nie powinieneś dzwonićnew
naActivity
ponieważ nie jest to właściwy sposób na rozpoczęcie.Jeśli chcesz rozpocząć nową instancję programu
mFragmentFavorite
, możesz to zrobić za pomocą plikuIntent
.Od
Fragment
:Intent intent = new Intent(getActivity(), mFragmentFavorite.class); startActivity(intent);
Z
Activity
Intent intent = new Intent(this, mFragmentFavorite.class); startActivity(intent);
Jeśli chcesz
aFavorite
zamiast tego zacząćmFragmentFavorite
, wystarczy zmienić ich nazwy w utworzonymIntent
.Zalecam również zmianę nazw klas, aby były dokładniejsze. Nazywanie czegoś
mFragmentFavorite
jest niewłaściwe, ponieważ wcale nie jestFragment
. Ponadto deklaracje klas w Javie zwykle zaczynają się od dużej litery. Dobrze by było, gdybyś nazwał swoją klasęFavoriteActivity
bardziej precyzyjną i zgodną z konwencjami językowymi. Jeśli zdecydujesz się to zrobić, musisz również zmienić nazwę pliku na FavoriteActivity.java, ponieważ Java wymaga, aby nazwy klas pasowały do nazwy pliku.AKTUALIZACJA
Wygląda też na to, że faktycznie chciałeś
mFragmentFavorite
być aFragment
zamiast aFragmentActivity
na podstawie tego, jak używaszonCreateView
. Jeśli chceszmFragmentFavorite
byćFragment
a, zmień następujący wiersz kodu:public class mFragmentFavorite extends FragmentActivity{
Zrób to zamiast tego przeczytaj:
public class mFragmentFavorite extends Fragment {
źródło
Fragment
lub anActivity
. Jeśli używasz kodu wewnątrz jednej z tych klas, możesz po prostu zamienićmContextReference
nagetActivity()
forFragment
lubthis
forActivity
w pierwszej linii ithis
drugiej linii. Zaktualizuję odpowiedź, aby była bardziej przejrzysta.Fragment
zmieńfindViewById
nav.findViewById
. Nie mafindViewById
funkcji,Fragment
więc musiszgetView
najpierw zadzwonić, a następnie to wywołaćfindViewById
. Jednak w twoim przypadku masz już swój widokonCreateView
i to byłaby twoja zmiennav
.Powinieneś użyć
getActivity()
do uruchamiania działań z fragmentówIntent intent = new Intent(getActivity(), mFragmentFavorite.class); startActivity(intent);
Powinieneś także nazywać klasy kapitalikami:
MFragmentActivity
zamiastmFragmentActivity
.źródło
Jeśli używasz getActivity () , musisz się upewnić, że aktywność wywołująca została już dodana . Jeśli aktywność nie została dodana w takim przypadku, więc możesz uzyskać wartość null po wywołaniu metody getActivity ()
w takich przypadkach getContext () jest bezpieczna
wtedy kod do uruchomienia działania zostanie nieco zmieniony, np.
Intent intent = new Intent(getContext(), mFragmentFavorite.class); startActivity(intent);
Aktywność, usługa i aplikacja rozszerzają klasę ContextWrapper, dzięki czemu można użyć metody this lub getContext () lub getApplicationContext () zamiast pierwszego argumentu.
źródło
Używam tego w moim fragmencie.
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; }
źródło
Być może będziesz musiał zamienić getActivity () na MainActivity.this dla tych, którzy mają z tym problemy.
źródło
Rozpocznij nową aktywność od fragmentu:
Intent intent = new Intent(getActivity(), TargetActivity.class); startActivity(intent);
Rozpocznij nowe działanie od działania:
Intent intent = new Intent(this, TargetActivity.class); startActivity(intent);
źródło
z Kotlinem wykonuję ten kod:
requireContext().startActivity<YourTargetActivity>()
źródło
None of the following functions can be called with the arguments supplied. startActivity(Intent!) defined in android.content.Context startActivity(Intent!, Bundle?) defined in android.content.Context