31

ポケットベルでフラグメントアクティビティがあります:

List<Fragment> fragments = new Vector<Fragment>();
    fragments.add(Fragment.instantiate(this, PastEventListFragment.class.getName(),bundle));
    fragments.add(Fragment.instantiate(this, EventListFragment.class.getName(),bundle));

    this.mPagerAdapter  = new EventPagerAdapter(super.getSupportFragmentManager(), fragments);
    //
    ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager1);

    pager.setAdapter(this.mPagerAdapter);
    pager.setCurrentItem(1);

onKeyDownイベントをキャッチします:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {

    }
    return super.onKeyDown(keyCode, event);
}

質問は次のとおりです。このアクティビティでインスタンス化したすべてのフラグメントでイベントを使用する方法。ありがとう

4

6 に答える 6

39

できることは、フラグメントクラスでカスタムメソッドを定義することです。例えば:

public void myOnKeyDown(int key_code){
   //do whatever you want here
}

そして、Activityクラスでキーダウンイベントが発生するたびにこのメソッドを呼び出します。例えば:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        ((PastEventListFragment)fragments.get(0)).myOnKeyDown(keyCode);
        ((EventListFragment)fragments.get(1)).myOnKeyDown(keyCode);

        //and so on...
    }
    return super.onKeyDown(keyCode, event);
}
于 2012-08-31T08:17:42.050 に答える
9

誰かが Boradcast でそれを行う方法に興味がある場合:

onViewCreated のフラグメント内

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);


// Register to receive messages.
// We are registering an observer (mMessageReceiver) to receive Intents
// with actions named "custom-event-name".
 LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
 new IntentFilter("activity-says-hi"));

...}

 // Our handler for received Intents. This will be called whenever an Intent
 // with an action named "custom-event-name" is broadcasted.
 private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
 // Get extra data included in the Intent

 doSomethingCauseVolumeKeyPressed();

 }
};

あなたのキーイベント - アクティビティに入れるコード

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int action = event.getAction();
    int keyCode = event.getKeyCode();
    switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            if (action == KeyEvent.ACTION_DOWN) {
                sendBroadcast();
            }
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            if (action == KeyEvent.ACTION_DOWN) {
                sendBroadcast();
            }
            return true;
        default:
            return super.dispatchKeyEvent(event);
    }
}

ブロードキャスト送信者:

private void  sendVolumeBroadcast(){
    Intent intent = new Intent("activity-says-hi");
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
于 2016-02-25T14:43:07.123 に答える
4

密結合を避けるための@hsu.twの回答に続いて、この要点が見つかりました。

密結合を避けるには代償が伴います: フォーカス可能なビューが必要です (幸運なことに、他のタッチ イベントをリッスンするビューがフォアグラウンドに既にあったので、それを追加したのが私のケースでしたView.OnKeyListener)。

View.OnKeyListenerをアクティビティとは無関係にフラグメント内のビューにアタッチするために必要な手順は次のとおりです (要旨を確認してください)。

 view.setFocusableInTouchMode(true);
 view.requestFocus();
 view.setOnKeyListener(pressKeyListener);

onViewCreatedFragmentのコールバックでこれを実装しました

于 2019-08-05T15:24:51.450 に答える