web-dev-qa-db-fra.com

Comment faire un rappel entre l'activité et le fragment?

J'ai cette interface dans mon activité.

public interface LogoutUser {
    void logout();
}

Mon fragment implémente cette interface, donc dans mon fragment, j'ai ceci:

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

Dans mon activité j'appelle

mLogoutUser.logout();

mLogoutUser est du type interface LogoutUser.

Mon problème est l'objet mLogoutUser qui est nul. Comment l'initialiser?

Je vous remercie!

15
androidevil

Fragments Android - Communiquer avec l'activité

Vous devez obtenir une référence à votre fragment avec getFragmentById() ou getFragmentByTag()

getFragmentManager().findFragmentById(R.id.example_fragment);
4
Erik Nedwidek

Comme je l'ai dit dans mon commentaire, j'ai résolu ce problème en utilisant la méthode onAttach dans mon fragment, mais de cette façon, vous devez avoir le champ de rappel (mLogoutUser dans ce cas) déclaré dans le fragment et l'initialiser de cette façon :

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

    ...
}

Plus d'informations dans Communiquer avec d'autres fragments .


Mais si votre cas est le champ déclaré dans l'activité, vous pouvez utiliser la méthode onAttachFragment de votre activité pour initialiser votre champ d'écoute de cette façon:

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

    mLogoutUser = (LogoutUser) fragment;
}

Vous pouvez également utiliser un bus d'événements pour établir cette communication entre les fragments et les activités. Une option est la bibliothèque Otto , de Square.

13
androidevil

Exemple de création de rappel de fragment à activité

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();
    }
}
9
Xar E Ahmer