2015-09-20 114 views
0

如何將setOnTouchListener設置爲操作欄菜單項以添加功能從操作欄拖動某個項目?操作欄 - 拖動菜單項

例如,如果我這樣做:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

     <item android:id="@+id/my_menu_item_button" 
      android:icon="@android:drawable/ic_menu_mylocation" 
      android:title="TEST" 
      app:showAsAction="always" /> 

</menu> 

並嘗試做到這一點:

final MenuItem myMenuItem = (MenuItem) findViewById(R.id.action_search); 

myMenuItem.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent me) {    
     return true; 
    } 
}); 

我不能因爲setOnTouchListener需要視圖。

任何解決方案?

這裏的骨架: https://gist.github.com/anonymous/b654b67d4dbd45ce8539

回答

1
View you can find easily by using menuItem.getActionView(), but I guess you get the action view as null if you have not set any custom view using MenuItem.setActionView(). 

Solution : 
Lets create a layout file called sample_action_view.xml 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_gravity="center_vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ImageView 
     android:id="@+id/mobile_link_action_bar_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingTop="10dp" 
     android:paddingBottom="10dp" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:src="sampleImage.png" 
     android:contentDescription="Sample Image"/>  
</LinearLayout> 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     LayoutInflater inflater = (LayoutInflater)this.getApplicationContext().getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE); 
     View sampleActionView = inflater.inflate(R.layout.sample_action_view, null); 
     MenuItem searchMenuItem = menu.findItem(R.id.menu_myDemoToolbarButton); 
     serachMenuItem.setActionView(sampleActionView); 

     sampleActionView.setOnTouchListener(new OnTouchListener() 
     { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) 
      { 
       // TODO Auto-generated method stub 
       return false; 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 
+0

可以請你爲此提供的例子嗎?你正確的爲空,我得到:「試圖調用接口方法'android.view.View android.view.MenuItem.getActionView()'在空對象引用」。 – ShP

+0

查看sampleView = inflater.inflate(R.layout.sampleLayout,null); myMenuItem.setActionView(sampleView),將所有偵聽器放在sampleView上。 – dex

+0

這是什麼「inflater」,我沒有在代碼中,getLayoutInflater()? – ShP