2013-05-10 8 views
6

Ich habe diese Schnittstelle in meiner Tätigkeit.Wie wird ein Rückruf zwischen Aktivität und Fragment durchgeführt?

public interface LogoutUser { 
    void logout(); 
} 

Mein Fragment implementiert diese Schnittstelle, so in meinem Fragment, ich habe diesen:

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

In meiner Tätigkeit nenne ich

mLogoutUser.logout(); 

Wo mLogoutUser der Schnittstelle Typ LogoutUser ist.

Mein Problem ist das mLogoutUser Objekt, das null ist. Wie kann es initialisiert werden?

Vielen Dank!

+1

mlogutUser = yourFragment; – dymmeh

Antwort

9

Wie ich in meinem Kommentar gesagt zu bekommen, ich dieses Problem gelöst mit onAttach Methode in meinem Fragmente, aber in diesem So müssen Sie das Rückruffeld (mLogoutUser in diesem Fall) im Fragment deklariert haben und es auf diese Weise initialisieren:

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

    ... 
} 

Weitere Informationen in Communicating with Other Fragments.


Aber wenn Ihr Fall das Feld in der Aktivität deklariert ist, können Sie die onAttachFragment Methode aus Ihrer Tätigkeit nutzen Sie Ihre Zuhörer Feld auf diese Weise zu initialisieren:

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

    mLogoutUser = (LogoutUser) fragment; 
} 

Auch können Sie Verwenden Sie einen Ereignisbus, um diese Kommunikation zwischen Fragmenten und Aktivitäten herzustellen. Eine Option ist die Otto library, von Square.

+1

Dank einer Tonne @androidevil. Du hast meinen Tag gerettet! BTW, wenn wir mehrere Fragmente haben, können wir If (fragment instanceof fragmentone) {} in onAttachFragment. – Kishore

4

Sample for Activity Rückruf von Fragment zur Schaffung

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

Sehr hilfreich ... vielen Dank Nepster – JamisonMan111

+0

Vielen Dank für diese vollständige Beispielantwort! –

Verwandte Themen