0

我爲我的問題準備了a simple test project at GitHubDrawerLayout與ListView表示動作 - 如何在視圖上調用動作方法?

它是基於the well-known Navigation Drawer Example by Google - 通過在一個ListView音樂相關的操作右側抽屜擴展:

screenshot

的動作是在RES /價值/ strings.xml中所有定義:

<string-array name="music_actions"> 
    <item>Play</item> 
    <item>Pause</item> 
    <item>Stop</item> 
    <item>Shuffle</item> 
</string-array> 

<integer-array name="music_icons"> 
    <item>@drawable/ic_play_arrow_black_24dp</item> 
    <item>@drawable/ic_pause_black_24dp</item> 
    <item>@drawable/ic_stop_black_24dp</item> 
    <item>@drawable/ic_shuffle_black_24dp</item> 
</integer-array> 

這裏是代碼讀取它們從資源(這非常適用):

public class MainActivity extends AppCompatActivity { 
    private String[] mActions; 
    private int[] mIcons; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mActions = getResources().getStringArray(R.array.music_actions); 

     TypedArray ta = getResources().obtainTypedArray(R.array.music_icons); 
     mIcons = new int[ta.length()]; 
     for (int i = 0; i < mIcons.length; i++) 
       mIcons[i] = ta.getResourceId(i, R.drawable.ic_menu_black_24dp); 
     ta.recycle(); 

我的問題是:

從聽者的onItemClick方法爲ListView - 如何調用片段中的相應的方法?

我只看到醜陋的方式與一個硬編碼switch語句來完成它,就像這裏:

mRightDrawer.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mActions) { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      TextView view = (TextView) super.getView(position, convertView, parent); 
      view.setCompoundDrawablesWithIntrinsicBounds(mIcons[position], 0, 0, 0); 
      return view; 
     } 
    }); 
    mRightDrawer.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if (mActiveFragment instanceof GameFragment) { 
       GameFragment fragment = (GameFragment) mActiveFragment; 
       switch (position) { 
       case 0: 
        fragment.playMusic(); // and then this calls myView.playMusic(); 
        break; 
       case 1: 
        fragment.pauseMusic(); // calls myView.pauseMusic(); 
        break; 
       } 
      } 

      mDrawerLayout.closeDrawer(mRightDrawer); 
     } 
    }); 

這是醜陋的,因爲我有跟蹤我的當前活動的片段,然後使用包裝方法最後調用方法在我的自定義視圖。

如何改善這種情況,我應該在我的自定義視圖中使用BroadcastReceiver

我希望,我可以在我的資源中定義圖標+標題+動作,然後使用它們。

UPDATE:

現在我使用BroadcastReceiver,但不知道它是一個apropriate溶液(或可能過重,重量是多少?)。

在我的片段我打電話:

@Override 
public void onResume() { 
    super.onResume(); 

    myView.register(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 

    myView.unregister(); 
} 

而且在我的自定義視圖我有:

public class MyView extends View { 

    public final static String ACTION_PLAY = "de.afarber.myapp.play"; 
    public final static String ACTION_PAUSE = "de.afarber.myapp.pause"; 
    public final static String ACTION_STOP = "de.afarber.myapp.stop"; 
    public final static String ACTION_SHUFFLE = "de.afarber.myapp.shuffle"; 

    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action = intent.getAction(); 
       if (ACTION_PLAY.equals(action)) 
        playMusic(); 
       else if (ACTION_PAUSE.equals(action)) 
        pauseMusic(); 
       else if (ACTION_STOP.equals(action)) 
        stopMusic(); 
       else if (ACTION_SHUFFLE.equals(action)) 
        shuffleMusic(); 
      } 
    }; 

    public void register() { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(ACTION_PLAY); 
     filter.addAction(ACTION_PAUSE); 
     filter.addAction(ACTION_STOP); 
     filter.addAction(ACTION_SHUFFLE); 
     getContext().registerReceiver(mMessageReceiver, filter); 
    } 

我寧願有某種「上下文菜單」的片段中 - 定義冠軍+圖標+動作 - 然後可以使用右側抽屜中的動作ListView ...

public void unregister() { 
     getContext().unregisterReceiver(mMessageReceiver); 
    } 

回答

0

廣播工作以及對我的基於DrawerLayout應用程序,但爲了更好的安全性和效率我已經切換到LocalBroadcastManager -

MainActivity.java(正確的行動抽屜菜單發送廣播):

mRightDrawer.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      String action = mActions[position]; 
      Intent intent = new Intent(action); 
      //intent.putExtra("message", "data"); 
      LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); 
      mDrawerLayout.closeDrawer(mRightDrawer); 
     } 
    }); 

PlanetFragment.java (活動片段接收應用內部廣播):

​​
+1

如果你想使用的話,還有其他的三方圖書館很少。來自綠色機器人和rx android的EventBus。 – Raghunandan

相關問題