如何从程序动态地在tablelayout行上应用上下文菜单

时间:2010-10-31 10:53:29

标签: android

亲爱的朋友们,               我创建了一个音乐应用程序。它包含一些专辑集合,当我们点击特定专辑时,该专辑中的歌曲将被加载到其他活动中。这些歌曲显示为表格布局的行,并且这些行基于歌曲动态地改变。我已经为tablerow注册了上下文菜单,并且还显示了该上下文菜单。但我的问题是找到一个特定的行,在onContextItemSelected()中无法显示上下文菜单。我试过ContextMenuInfo info = item.getMenuInfo();但是信息变为空。我的问题是, 1)上下文菜单是否仅适用于使用适配器的ListView? 2)Tablelayout也像ListView一样工作,那么我的代码有什么问题?

代码快照

 public class AlbumActivity extends Activity{
   private int DYNAMIC_ROW_ID = 1;

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.album);
    LoadingAlbumThread t = new LoadingAlbumThread(dataHandler);
    t.start();
}
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.album_contextmenu, menu);  
 }

public boolean onContextItemSelected(MenuItem item){
    ContextMenuInfo info = item.getMenuInfo();    // here 'info' gets null value,that is the main problem in my application
    switch(item.getItemId()){
    case R.id.playsong_contextmenuitem:
        playSong(info.id); //This 'info.id' gives the id of selected table row
        return true;
    case R.id.add_to_playlist_contextmenuitem:
        return true;
    case R.id.emial_contextmenuitem:
        return true;
    case R.id.twitter_contextmenuitem:
        return true;
    case R.id.facebook_contextmenuitem:
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }

}
final Handler dataHandler = new Handler(){
    public void handleMessage(Message msg){
        TableRow tr = new TableRow(getBaseContext());
        registerForContextMenu(tr);
            tr.setId(DYNAMIC_ROW_ID++);
            .......
            .......
    }
};
private class LoadingAlbumThread extends Thread{
Handler handler = null;
public LoadingDataThread(Handler handler) {
   this.handler = handler;
}
public void run(){
      albumJSONObject = getJSONObject(intent.getStringExtra("JSONAlbumData"));
      if(albumJSONObject!=null)
             albumJSONArray = albumJSONObject.getJSONArray("album");
      if(albumJSONArray!=null){                 
      noOfSongs = albumJSONArray.length();
      for(int i=0;i<noOfSongs;i++){
    songTitleStr = songsJSONArray.getJSONObject(i).getString("song_title");
    handler.sendMessage(handler.obtainMessage());
      }
      }
   }private JSONObject getJSONObject(String data){
        JSONObject jsonObj = null;
            if(data!=null){
                jsonObj = new JSONObject(data)
            }
        return jsonObj;
}

我欢迎您提出宝贵意见。

由于 VENU

2 个答案:

答案 0 :(得分:2)

对于这个问题,我在下面找到了解决方案

http://www.anddev.org/post87342.html?hilit=context%20menu%20on%20tablelayout#p87342

答案 1 :(得分:1)

  

上下文菜单是否仅适用于使用适配器的ListView?

不,任何小部件都可以设置上下文菜单。在您的情况下,您需要为每个registerForContextMenu()致电TableRow

话虽如此,如果您希望有超过几十行,我建议您将其转换为ListView