2012-08-31 13 views
16

Mam aktywność fragmentu z pagera:Fragment aktywność haczyk onKeyDown i wykorzystywać w fragmencie

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

złapię onKeyDown zdarzenie:

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

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

pytanie brzmi: Jak używać zdarzenie we wszystkich fragmentów i powstały w tym działaniu. Dzięki

Odpowiedz

27

To, co możesz zrobić, to zdefiniować niestandardową metodę w swoich klasach fragmentów. Na przykład:

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

i wywołaj tę metodę za każdym razem, gdy w klasie Activity podniesione zostanie wydarzenie z kluczem. Na przykład:

@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

mocno sprzęgło! ew. –

+5

@ JonWillis Zapraszam do zapewnienia lepszego rozwiązania. – Oleksiy

+1

Właściwie możesz użyć interfejsu, LocalBroadcast lub po prostu użyć EventBus i wysłać KeyEvent, używając go do każdego, kto chce. – Stan

4

Jeśli ktoś interessed jak to zrobić z Boradcast:

W swoim fragmencie w 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(); 

} 
}; 

swoją keyEvent - kod, aby umieścić w działalności

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

Twój nadawca transmisji:

private void sendVolumeBroadcast(){ 
    Intent intent = new Intent("activity-says-hi"); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 
+0

Podoba mi się to rozwiązanie. Mniejsze sprzężenie niż te oznaczone jako prawidłowe. Dzięki! –

0

Poddałem klasy Klasy aktywności i fragmentów do wykonania przekazywania KeyEvents. Dla mnie wygląda to wyraźniej niż wysyłanie lokalnych programów. Ale to rozwiązanie może nie być tak elastyczne. Wybierz preferowany sposób samodzielnie.

Oto działalność:

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

i fragment:

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

Streszczenie: https://gist.github.com/0neel/7d1ed5d26f2148b4168b6616337159ed

Powiązane problemy