3

私はFragmentmy に 2 つのActivity: fragment Awith buttonXと fragment Bwith button を持っていますY

Xボタンをクリックしたときにボタンの背景画像を変更するにはどうすればよいBですか? 出来ますか?

4

3 に答える 3

11

ドキュメントから、

各フラグメントは独自のライフサイクル コールバックを使用して独自のレイアウトと独自の動作を定義するため、1 つのフラグメントを複数のアクティビティに含めることができるため、再利用できるように設計し、別のフラグメントから 1 つのフラグメントを直接操作しないようにする必要があります。

そうは言っても、あなたがしたいことは、 activity へのイベント コールバックを作成することです。これを行う良い方法は、フラグメント内にコールバック インターフェイスを定義し、ホスト アクティビティがそれを実装することを要求することです。アクティビティがインターフェイスを介してコールバックを受信すると、必要に応じてレイアウト内の他のフラグメントと情報を共有できます。これは、2 つの別々Fragmentの 間でイベントを共有するための推奨される方法です。つまり、アクティビティを通じてイベントを共有します。

上記のリンクをチェックしてください...それはいくつかの良い例を提供します. それでも問題が解決しない場合はお知らせください。


編集#1:

フラグメント内のボタンをクリックして、フラグメントA内のボタンに変更を加えたいとしましょうB。概念を示すサンプル コードを次に示します。

コールバック インターフェイス:

public interface OnButtonClickedListener {
    public void onButtonClicked(); 
}

アクティビティ:

public class SampleActivity extends Activity implements OnButtonClickedListener {

    /* Implementation goes here */     

    public void onButtonClicked() {
        // This method is called from fragment A, and when it is called,
        //   it will send information to fragment B. Remember to first
        //   check to see if fragment B is non-null.

        /* Make call to a method in fragment B that will update its display */
    }
} 

フラグメント A:

public class FragmentA extends Fragment {
    OnButtonClickedListener mListener;

    /* Implementation goes here */

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnButtonClickedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnButtonClickedListener ");
        }
    }

    public void clickButton() {
        // When the button is clicked, notify the activity.
        //   The activity will then pass the information to fragment
        //   B (if it has been created).

        mListener.onButtonClicked();
    }
}

編集#2:

ここで、「なぜ、このような問題が発生するのでしょうか? Fragment でA直接 Fragment を操作できるのに、個別のアクティビティ コールバック メソッドを作成する意味があるでしょうか?」と疑問に思われるかもしれませんB

これを行う主な理由は、各フラグメントがモジュール式で再利用可能なアクティビティ コンポーネントとして設計されるようにするためです。モジュラー フラグメントを使用すると、さまざまな画面サイズに合わせてフラグメントの組み合わせを変更できるため、これは特に重要です。タブレットとハンドセットの両方をサポートするようにアプリケーションを設計する場合、さまざまなレイアウト構成でフラグメントを再利用して、使用可能な画面スペースに基づいてユーザー エクスペリエンスを最適化できます。たとえば、ハンドセットでは、複数のフラグメントが同じアクティビティ内に収まらない場合、単一ペインの UI を提供するためにフラグメントを分離する必要がある場合があります。アクティビティ コールバックを使用すると、フラグメントが使用されない状況でフラグメントを簡単に再利用できるようになります。B画面に表示されません。たとえば、ハンドヘルド デバイスを使用していて、fragment を表示する十分なスペースがない場合、フラグメントが現在画面に表示されているBかどうかを確認するアクティビティ チェックを簡単に行うことができます。B

これが明確でない場合は申し訳ありません...説明するのが難しいと思います:P. インタラクティブなマルチペイン レイアウトで作業している場合、アクティビティコールバックを使用すると、開発者としての作業が特に簡単になります。

于 2012-05-22T03:54:37.473 に答える
1

Alex Lockwood の回答に基づく:

アクティビティ:

public class SampleActivity extends Activity{

    public interface OnButtonClickedListener {
           public void onButtonClicked(); 
    }

    private OnButtonClickedListener onButtonClickedListener = null;

    public OnButtonClickedListener getOnButtonClickedListener () {
           return onButtonClickedListener 
    }

    public void setOnButtonClickedListener (
        OnButtonClickedListener onButtonClickedListener {
           this.onButtonClickedListener  = onButtonClickedListener;
    }

} 

フラグメント A:

public class FragmentA extends Fragment {

private OnButtonClickedListener onButtonClickedListener = null;

private OnClickListener actionBarClickListener = new OnClickListener() {

    @Override
    public void onClick(View view) {
        if (onButtonClickedListener == null){
            onButtonClickedListener = ((SampleActivity) getActivity()).onButtonClickedListener ();
        }
        if (onButtonClickedListener != null) {
            onButtonClickedListener
                    .onButtonClicked();
        }
    }
};

}

フラグメント B:

    public class FragmentB extends Fragment {

private OnButtonClickedListener onButtonClickedListener = new OnButtonClickedListener() {

    @Override
    public void onButtonClicked() {

        Toast.makeText(getActivity(), "Button clicked", Toast.LENGTH_SHORT).show();
    }
};

@Override
public void onResume() {
    super.onResume();
    SampleActivity sampleActivity = (SampleActivity) getActivity();
    sampleActivity.setSearchBoxTextChangedListener(onButtonClickedListener);
}

}

希望は誰かを助けることができます。

于 2014-03-28T09:33:59.933 に答える
0

onClickフラグメントのレイアウトであっても、レイアウト内のボタンの属性を設定すると、 で適切なメソッドが呼び出されますActivity

その後、アプリはこのシグナルActivityをフラグメント B に送信できます。

于 2014-02-09T09:30:45.647 に答える