2012-08-31 17 views
16

में उपयोग मैं पेजर के साथ टुकड़ा गतिविधि है:टुकड़ा गतिविधि पकड़ OnKeyDown और टुकड़ा

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

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

प्रश्न है:

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 घटना को पकड़ने कैसे सभी टुकड़े में घटना का उपयोग करने के मैं इस गतिविधि में तत्काल है। धन्यवाद

उत्तर

27

आप अपने टुकड़े वर्ग (ओं) में एक कस्टम विधि को परिभाषित करने के लिए क्या कर सकते हैं। उदाहरण के लिए:

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

और जब भी आपकी गतिविधि कक्षा में एक कुंजी-डाउन ईवेंट उठाया जाता है तो इस विधि को कॉल करें। उदाहरण के लिए:

@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

@ जोनविलिस बेहतर समाधान प्रदान करने के लिए स्वतंत्र महसूस करें – Oleksiy

+1

असल में आप इंटरफ़ेस, लोकल ब्रॉडकास्ट का उपयोग कर सकते हैं या केवल इवेंटबस का उपयोग कर सकते हैं और इसे किसी भी व्यक्ति को इसका उपयोग करके 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

मैंने कुंजी और गुजरने के लिए गतिविधि और टुकड़े वर्गों को उप-वर्गीकृत किया है। मेरे लिए, यह स्थानीय प्रसारण भेजने से स्पष्ट दिखता है। लेकिन यह समाधान इतना लचीला नहीं हो सकता है। अपने आप से पसंदीदा तरीका चुनें।

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

संबंधित मुद्दे