web-dev-qa-db-ja.com

アクティビティとフラグメントの間でコールバックを行う方法は?

私の活動にはこのインターフェースがあります。

public interface LogoutUser {
    void logout();
}

私のフラグメントはこのインターフェースを実装しているので、私のフラグメントでは、これを持っています:

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

私の活動の中で私は電話します

mLogoutUser.logout();

ここで、mLogoutUserはタイプLogoutUserインターフェースです。

私の問題は、nullであるmLogoutUserオブジェクトです。どのように初期化できますか?

ありがとうございました!

15
androidevil

Androidフラグメント-アクティビティとの通信

getFragmentById()またはgetFragmentByTag()を使用してフラグメントへの参照を取得する必要があります

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

コメントで述べたように、フラグメントでonAttachメソッドを使用してこの問題を解決しましたが、この方法では、フラグメントでコールバックフィールド(この場合はmLogoutUser)を宣言し、この方法で初期化する必要があります:

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

    ...
}

詳細は 他のフラグメントとの通信 を参照してください。


ただし、ケースがアクティビティで宣言されたフィールドである場合は、アクティビティのonAttachFragmentメソッドを使用して、次のようにリスナーフィールドを初期化できます。

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

    mLogoutUser = (LogoutUser) fragment;
}

また、イベントバスを使用して、フラグメントとアクティビティ間のこの通信を行うことができます。オプションは、Squareの Ottoライブラリ です。

13
androidevil

フラグメントからアクティビティへのコールバックを作成するためのサンプル

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