2012-08-31 19 views
16

使用我有片段的活性與尋呼機:片段活動捕捉onKeyDown和在片段

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

的問題是: 如何在所有片段使用事件我已經在這個活動中實例化。謝謝

回答

27

你可以做的是在你的片段類中定義一個自定義方法。例如:

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); 
} 
+8

緊密耦合! EW。 –

+5

@JonWillis隨意提供更好的解決方案 – Oleksiy

+1

實際上,您可以使用接口LocalBroadcast或僅使用EventBus並將KeyEvent發送給任何需要它的人。 – Stan

4

如果有人interessed如何與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(); 

} 
}; 

您的KeyEvent - 代碼投放活動

@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); 
} 
+0

我喜歡這個解決方案。比標記正確的耦合少。謝謝! –

0

我已經子類化Activity和Fragment類來執行KeyEvents傳遞。對我而言,它比發送本地廣播更清晰。但是這個解決方案可能不那麼靈活。自己選擇首選方式。

這裏的活動:

public abstract class KeyEventPassingActivity extends Activity { 

    public interface KeyEventListener extends View.OnKeyListener { 
     boolean isVisible(); 
     View getView(); 
    } 

    private final List<KeyEventListener> keyEventHandlerList = new ArrayList<>(); 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     for (KeyEventListener handler : keyEventHandlerList) { 
      if (handleKeyEvent(handler, event)) { 
       return true; 
      } 
     } 
     return super.dispatchKeyEvent(event); 
    } 

    void addKeyEventHandler(@NonNull KeyEventListener handler) { 
     keyEventHandlerList.add(handler); 
    } 

    void removeKeyEventHandler(@NonNull KeyEventListener handler) { 
     keyEventHandlerList.remove(handler); 
    } 

    /** 
    * @return <tt>true</tt> if the event was handled, <tt>false</tt> otherwise 
    */ 
    private boolean handleKeyEvent(@Nullable KeyEventListener listener, KeyEvent event) { 
     return listener != null 
       && listener.isVisible() 
       && listener.onKey(listener.getView(), event.getKeyCode(), event); 
    } 
} 

和碎片:

public abstract class KeyEventHandlingFragment extends Fragment 
     implements KeyEventPassingActivity.KeyEventListener { 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof KeyEventPassingActivity) { 
      ((KeyEventPassingActivity) activity).addKeyEventHandler(this); 
     } 
    } 

    @Override 
    public void onDetach() { 
     Activity activity = getActivity(); 
     if (activity instanceof KeyEventPassingActivity) { 
      ((KeyEventPassingActivity) activity).removeKeyEventHandler(this); 
     } 
     super.onDetach(); 
    } 
} 

要點:https://gist.github.com/0neel/7d1ed5d26f2148b4168b6616337159ed