59

Ho 2 frammenti con su entrambi i frammenti un pulsante. Quando premo il pulsante mi piacerebbe iniziare una nuova attività. Ma non riesco a farlo funzionare.Avvia un'attività da un frammento

L'errore che sto ricevendo: ERRORE qui: Tipo non corrispondente: non può convertire da mFragmentFavorite di frammentare

Che cosa sto facendo di sbagliato?

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

Se FavoriteActivity estende frammenti, l'errore è scomparso, ma poi ottengo un errore alla findViewById(R.id.mainFavorite); e l'errore è

Procedimento findViewById (int) è definito per il tipo FavoriteActivity

EDIT:

Quando si preme il pulsante nel frammento dell'inizio dell'attività poi l'applicazione si blocca questo è il mio 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) 
+3

Forse non dovresti estendere FragmentActivity ma piuttosto Fragment? – span

+1

Beh, per uno non stai usando 'Fragments'. Almeno no nel codice che hai postato. – adneal

risposta

176

mFragmentFavorite nel codice è a FragmentActivity che non è la stessa cosa di Fragment. È per questo che stai riscontrando la mancata corrispondenza di tipo. Inoltre, non chiamare mai new su un Activity in quanto non è il modo corretto per avviarne uno.

Se si desidera avviare una nuova istanza di mFragmentFavorite, è possibile farlo tramite Intent.

Da un Fragment:

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

Dal Activity

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

Se vuoi iniziare aFavorite invece di mFragmentFavorite allora avete solo bisogno di cambiare i loro nomi nel creato Intent.

Inoltre, ti consiglio di cambiare il nome della tua classe per essere più preciso. Chiamare qualcosa mFragmentFavorite non è corretto in quanto non è un Fragment affatto. Inoltre, le dichiarazioni di classe in Java iniziano generalmente con una lettera maiuscola. Faresti bene a dare un nome alla tua classe come FavoriteActivity per essere più preciso e conforme alle convenzioni linguistiche. Sarà inoltre necessario rinominare il file in FavoriteActivity.java se si sceglie di farlo poiché Java richiede che i nomi delle classi corrispondano al nome del file.

UPDATE

Inoltre, sembra che in realtà significava per mFragmentFavorite di essere un Fragment invece di un FragmentActivity in base all'utilizzo del onCreateView. Se si vuole mFragmentFavorite essere un Fragment quindi modificare la seguente riga di codice:

public class mFragmentFavorite extends FragmentActivity{ 

rendere questo posto letto:

public class mFragmentFavorite extends Fragment { 
+0

Ok, aggiornerò il codice nel primo post. Ma non capisco perfettamente l'mContextReference. Aggiornerò il codice con quello che ho e nomi migliori, dammi 5 min – mXX

+0

È un esempio di riferimento a un 'Fragment' o a' Activity'. Se stai usando il codice all'interno di una di queste classi, puoi semplicemente sostituire 'mContextReference' con' getActivity() 'per' Fragment' o 'this' per' Activity' sulla prima riga e 'this' per il seconda linea. Aggiornerò la risposta per essere più chiaro. – MCeley

+0

Ok, ho aggiornato la domanda con nomi migliori e i consigli che mi hai dato. Proverò ora ad attuare il tuo suggerimento per cercare di farlo funzionare. Grazie per l'aiuto – mXX

19

si dovrebbe usare getActivity() per lanciare le attività da frammenti

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

Inoltre, è necessario assegnare un nome alle classi con maiuscole: MFragmentActivity anziché mFragmentActivity.

+2

Breve e dolce. – offset

2

Lo uso nel mio frammento.

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

Se si utilizza getActivity() poi si deve fare in modo che l'attività chiamata è aggiunto già. Se l'attività non è stato aggiunto in questo caso quindi si può ottenere nullo quando si chiama getActivity()

in questi casi getContext() è sicuro

quindi il codice per avviare l'attività sarà essere un po 'cambiato come,

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

attività, servizio e applicazione estende la classe ContextWrapper modo da poter utilizzare questo o getContext() o getApplicationContext() al posto del primo argomento.

Problemi correlati