59

Mam 2 fragmenty z obu fragmentów przycisk. Po naciśnięciu przycisku chcę rozpocząć nową aktywność. Ale nie mogę zmusić go do działania.Rozpocznij aktywność od fragmentu

Błąd Dostaję: ERROR tutaj: Niezgodność typów: nie można przekonwertować z mFragmentFavorite fragmentowi

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

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

Jeśli FavoriteActivity rozciąga fragmenty, błąd zniknął, ale potem pojawia się błąd przy findViewById(R.id.mainFavorite); a błąd jest

Sposób findViewById (int) jest zdefiniowana dla typu FavoriteActivity

Edycja:

Po naciśnięciu przycisku w fragmentem, aby rozpocząć działanie, a następnie aplikacja zawiesza tę to mój kod logujący

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) 
+3

Być może nie powinieneś rozszerzać FragmentActivity, ale raczej Fragmentu? – span

+1

Cóż, dla jednego nie używasz 'Fragmentów'. Przynajmniej nie w opublikowanym przez ciebie kodzie. – adneal

Odpowiedz

176

mFragmentFavorite w kodzie jest a FragmentActivity co nie jest tym samym co Fragment. Właśnie dlatego dostajesz niedopasowanie typu. Ponadto nie należy nigdy dzwonić pod numer new pod numerem Activity, ponieważ nie jest to właściwy sposób na jego uruchomienie.

Jeśli chcesz uruchomić nowe wystąpienie mFragmentFavorite, możesz to zrobić przez Intent.

Z Fragment:

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

Z Activity

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

Jeśli chcesz rozpocząć aFavorite zamiast mFragmentFavorite potem trzeba tylko zmienić swoje nazwy w stworzonym Intent.

Polecam również zmianę nazw klas, aby były bardziej dokładne. Wywołanie czegoś mFragmentFavorite jest niewłaściwe, ponieważ w ogóle nie jest to Fragment. Ponadto deklaracje klas w Javie zazwyczaj zaczynają się od dużej litery. Dobrze byś nazwał swoją klasę czymś w rodzaju FavoriteActivity, aby była dokładniejsza i zgodna z konwencjami językowymi. Będziesz także musiał zmienić nazwę pliku na FavoriteActivity.java, jeśli zdecydujesz się to zrobić, ponieważ Java wymaga, aby nazwy klas pasowały do ​​nazwy pliku.

UPDATE

Również wygląda rzeczywiście przeznaczona dla mFragmentFavorite być Fragment zamiast FragmentActivity oparte na wykorzystaniu onCreateView. Jeśli chcesz mFragmentFavorite się być Fragment następnie zmienić następującą linię kodu:

public class mFragmentFavorite extends FragmentActivity{ 

Zrób to zamiast czytać:

public class mFragmentFavorite extends Fragment { 
+0

OK, zaktualizuję kod w pierwszym poście. Ale nie całkiem rozumiem mContextReference. Zaktualizuję kod o to, co mam, i lepsze imiona, daj mi 5 min. – mXX

+0

Jest to przykład odwołania do "Fragmentu" lub "Aktywności". Jeśli używasz kodu wewnątrz jednej z tych klas, możesz po prostu zamienić 'mContextReference' na' getActivity() 'dla' Fragment' lub 'this' dla' Activity' w pierwszym wierszu i 'this' dla druga linia. Zaktualizuję odpowiedź, aby była bardziej przejrzysta. – MCeley

+0

OK, zaktualizowałem pytanie o lepsze imiona i porady, które mi dałeś. Spróbuję teraz zaimplementować Twoją sugestię, aby spróbować ją uruchomić. Dzięki za pomoc – mXX

19

Należy użyć getActivity() rozpocząć działalność z fragmentów

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

Powinieneś także nazwać klasy z kodami: MFragmentActivity zamiast mFragmentActivity.

+2

Krótkie i słodkie. – offset

2

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

Jeśli używasz getActivity() potem trzeba się upewnić, że aktywność powołanie jest dodany już. Jeśli aktywność nie została dodana w takim przypadku można więc dostać zerowej kiedy zadzwonić getActivity()

w takich przypadkach getContext() jest bezpieczny

następnie kod dla rozpoczęcia działalności będzie jak zmieniły się nieznacznie,

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

aktywny, usługi i aplikacje rozszerza klasę ContextWrapper więc można użyć ten lub getContext() lub getApplicationContext() w miejscu pierwszego argumentu.

Powiązane problemy