2014-09-09 19 views
6

Sono stato alla ricerca a StackOverflow per risolvere il mio problema e ha trovato qualcosa di abbastanza buono, ma non funziona per me o io sono per stupido per vederlo (How to implement OnFragmentInteractionListener)Android: Errore con il frammento di interazione Listener

I voglio posizionare un frammento all'interno di un Frame, così l'ho creato e così via. Devo impiantare un'interfaccia e il suo metodo. Io (penso) l'ho fatto, ma la mia app si blocca ogni volta ...

* Modifica: La mia app si arresta in modo anomalo, quando chiamo openHome o openRaccomandato, il metodo onCreate funziona, ottengo questi errori, ma tutto viene visualizzato correttamente .

Questo è il mio codice:

MainActivity.java

import android.app.Activity; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 


public class MainActivity extends Activity implements HomeFragment.OnFragmentInteractionListener, RecommendedFragment.OnFragmentInteractionListener 
{ 
    FragmentTransaction fragmentTransaction; 
    HomeFragment homeFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     homeFragment = new HomeFragment(); 

     getFragmentManager().beginTransaction().add(R.id.mainFrame, homeFragment).commit(); 
    } 

    protected void openHome(View view) 
    { 
     /*Intent homeIntent = new Intent(this, HomeFragment.class); 
     startActivity(homeIntent); 

     homeFragment = new HomeFragment(); 
     getFragmentManager().beginTransaction().replace(R.id.mainFrame, homeFragment).commit();*/ 

     System.out.println("Success"); 
    } 

    public void openRecommended(View view) 
    { 
     Intent recommendedIntent = new Intent(this, RecommendedFragment.class); 
     startActivity(recommendedIntent); 

     RecommendedFragment recommendedFragment = new RecommendedFragment(); 
     getFragmentManager().beginTransaction().replace(R.id.mainFrame, recommendedFragment).commit(); 
    } 

    @Override 
    public void onFragmentInteractionHome(Uri uri) 
    { 

    } 

    @Override 
    public void onFragmentInteractionRecommended(Uri uri) 
    { 

    } 
} 

HomeFragment.java

import android.app.Activity; 
import android.app.Fragment; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


/** 
* A simple {@link Fragment} subclass. 
* Activities that contain this fragment must implement the 
* {@link HomeFragment.OnFragmentInteractionListener} interface 
* to handle interaction events. 
* Use the {@link HomeFragment#newInstance} factory method to 
* create an instance of this fragment. 
*/ 
public class HomeFragment extends Fragment 
{ 
    private OnFragmentInteractionListener mListener; 


    public static HomeFragment newInstance() 
    { 
     HomeFragment fragment = new HomeFragment(); 
     return fragment; 
    } 

    public HomeFragment() 
    { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) 
    { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_home, container, false); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) 
    { 
     if (mListener != null) 
     { 
      mListener.onFragmentInteractionHome(uri); 
     } 
    } 

    @Override 
    public void onAttach(Activity activity) 
    { 
     super.onAttach(activity); 
     try 
     { 
      mListener = (OnFragmentInteractionListener) activity; 
     } 
     catch (ClassCastException e) 
     { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() 
    { 
     super.onDetach(); 
     mListener = null; 
    } 

    /** 
    * This interface must be implemented by activities that contain this 
    * fragment to allow an interaction in this fragment to be communicated 
    * to the activity and potentially other fragments contained in that 
    * activity. 
    * <p/> 
    * See the Android Training lesson <a href= 
    * "http://developer.android.com/training/basics/fragments/communicating.html" 
    * >Communicating with Other Fragments</a> for more information. 
    */ 
    public interface OnFragmentInteractionListener 
    { 
     // TODO: Update argument type and name 
     public void onFragmentInteractionHome(Uri uri); 
    } 
} 

RecommendedFragment sembra la stessa, tranne alcuni metodi hanno un nome diverso.

ottengo sempre questo errore:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.domain.app/com.domain.app.MainActivity}: java.lang.ClassCastException: [email protected] must implement OnFragmentInteractionListener at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassCastException: [email protected] must implement OnFragmentInteractionListener at com.domain.app.HomeFragment.onAttach(HomeFragment.java:74) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:849) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) at android.app.BackStackRecord.run(BackStackRecord.java:684) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) at android.app.Activity.performStart(Activity.java:5240) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)             at android.app.ActivityThread.access$800(ActivityThread.java:135)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:136)             at android.app.ActivityThread.main(ActivityThread.java:5017)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)             at dalvik.system.NativeStart.main(Native Method)

ho davvero bisogno di aiuto qui, mi sono bloccato per ore ...

John

+0

**[email protected] deve implementare OnFragmentInteractionListener ** – mstrthealias

+0

Lo fa ?! classe pubblica MainActivity estende l'attività implementa HomeFragment.OnFragmentInteractionListener, RecommendedFragment.OnFragmentInteractionListener O mi sbaglio? – JRsz

+0

Mi chiedo se 'MainActivity' debba estendere' FragmentActivity' invece di 'Activity' ... – mbmc

risposta

7

Ho rimosso i riferimenti inutili e tutto ciò che riguarda con RecommendedFragment class. Se lo pubblichi aggiornerò la mia risposta.

L'ho provato e funziona. Ma prova a spiegare qual è il significato del metodo openHome(), perché non viene mai utilizzato in base al tuo codice, e tuttavia dici che l'app si arresta in modo anomalo quando la chiami.

Ho aggiunto questo metodo all'interfaccia perché mi sembra la cosa più logica da fare.

// MainActivity

public class MainActivity extends Activity implements HomeFragment.OnFragmentInteractionListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getFragmentManager().beginTransaction() 
       .add(R.id.mainFrame, new HomeFragment()) 
       .commit(); 
    } 

    @Override 
    public void openHome(View view) { 
     System.out.println("Success"); 
    } 

    @Override 
    public void onFragmentInteractionHome(Uri uri) { 
     Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show(); 
    } 

} 

// HomeFragment

public class HomeFragment extends Fragment { 

    private OnFragmentInteractionListener mListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_home, container, false); 
    } 

    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteractionHome(uri); 
     } 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
      mListener.onFragmentInteractionHome(Uri.parse("doWhatYouWant")); 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 


    public interface OnFragmentInteractionListener { 
     public void onFragmentInteractionHome(Uri uri); 
     public void openHome(View view); 
    } 

} 
+0

openhome() viene chiamato da un pulsante immagine, da un file .xml ... sembra funzionare, che è incredibile, ma ho avuto modo di andare a lavora ora, quindi lo testerò di sera, ma grazie per ora :) – JRsz

+0

Prego! :) –

+0

tutto funziona bene ora, deve essere stato un bug con Android Studio o sono troppo stupido per vederlo: D Comunque, grazie mille :) Darei la tua risposta, ma per questo ho bisogno di 15 rep:/ – JRsz

Problemi correlati