2013-05-10 9 views
6

Ho questa interfaccia nella mia attività.Come effettuare una richiamata tra attività e frammento?

public interface LogoutUser { 
    void logout(); 
} 

mio frammento implementa questa interfaccia, in modo a mio frammento, ho questo:

@Override 
public void logout() { 
    // logout 
} 

Nella mia attività io chiamo

mLogoutUser.logout(); 

Dove mLogoutUser è dell'interfaccia tipo LogoutUser.

Il mio problema è l'oggetto mLogoutUser null. Come può inizializzarlo?

Grazie!

+1

mLogoutUser = yourFragment; – dymmeh

risposta

9

Come ho detto nel mio commento, ho risolto questo problema utilizzando onAttach metodo nella mia frammento, ma in questo in modo da avere il campo di callback (mLogoutUser in questo caso) dichiarato nel frammento e inizializzarlo in questo modo:

public class MyFragment extends ListFragment { 
    LogoutUser mLogoutUser; 

    // Container Activity must implement this interface 
    public interface LogoutUser { 
     public void logout(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mLogoutUser = (LogoutUser) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement LogoutUser"); 
     } 
    } 

    ... 
} 

Maggiori informazioni in Communicating with Other Fragments.


Ma se il tuo caso è il campo dichiarato nella attività, è possibile utilizzare il metodo onAttachFragment dalla vostra attività per inizializzare il vostro campo ascoltatore in questo modo:

@Override 
public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 

    mLogoutUser = (LogoutUser) fragment; 
} 

Inoltre, è possibile utilizzare un bus eventi per rendere questa comunicazione tra frammenti e attività. Un'opzione è il Otto library, da Square.

+1

Grazie a tonnellata @androidevil. Mi hai salvato la giornata! BTW se abbiamo allegati più frammenti, possiamo farlo se (framment instanceof frammentone) {} in onAttachFragment. – Kishore

4

esempio per la creazione di richiamata dalla Frammento di attività

public interface CallBackListener { 
    void onCallBack();// pass any parameter in your onCallBack which you want to return 
} 

CallBackFragment.class

public class CallBackFragment extends Fragment { 

    private CallBackListener callBackListener; 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     return inflater.inflate(R.layout.fragment_call_back, container, false); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     //getActivity() is fully created in onActivityCreated and instanceOf differentiate it between different Activities 
     if (getActivity() instanceof CallBackListener) 
      callBackListener = (CallBackListener) getActivity(); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     Button btn = (Button) view.findViewById(R.id.btn_click); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(callBackListener != null) 
        callBackListener.onCallBack(); 
      } 
     }); 
    } 
} 

CallbackHandlingActivity.class

public class CallbackHandlingActivity extends AppCompatActivity implements CallBackListener 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_all_user); 

    } 

    @Override 
    public void onCallBack() { 
     Toast.makeText(mContext,"onCallback Called",Toast.LENGTH_LONG).show(); 
    } 
} 
+1

Estremamente utile ... grazie mille Nepster – JamisonMan111

+0

Grazie per questo esempio completo di risposta! –

Problemi correlati