16

私は自分の活動にこのインターフェースを持っています。

public interface LogoutUser {
    void logout();
}

私のフラグメントはこのインターフェースを実装しているので、私のフラグメントには次のものがあります。

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

私の活動では、私は呼び出します

mLogoutUser.logout();

LogoutUsermLogoutUserインターフェイスのタイプです。

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

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

4

3 に答える 3

21

コメントで述べたように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(Context context) {
        super.onAttach(context);

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

    ...
}

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


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

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

    mLogoutUser = (LogoutUser) fragment;
}

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

于 2015-08-20T23:54:54.403 に答える
5

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

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

getFragmentManager().findFragmentById(R.id.example_fragment);
于 2013-05-10T22:33:50.307 に答える