【问题标题】:How to apply context menu on rows of tablelayout dynamically from program如何从程序动态地在表格布局的行上应用上下文菜单
【发布时间】:2010-12-15 13:21:24
【问题描述】:

亲爱的朋友们, 我创建了一个音乐应用程序。它包含一些专辑集合,当我们单击特定专辑时,该专辑中的歌曲将被加载到另一个活动中。这些歌曲显示为表格布局的行,这些行根据歌曲动态更改。我已经为 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;
}

欢迎您提出宝贵的建议。

谢谢 金星

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢您的好建议..在我的应用程序中,所有歌曲都动态显示为表格行..所以当我要为一首歌曲创建表格行时,我为该行注册了上下文菜单。我对所有表格行(歌曲)重复这个过程。我的问题是,当我单击歌曲(表格行)时,将显示上下文菜单,然后如果我们选择任何菜单项,将调用 onContextitemSelected() 但我无法在此方法中找到所选行..你能给我在这种情况下的建议?如果动态创建更多的 mo.of 表行会发生什么?提前致谢。
      • @Venu Gopal:“onContextitemSelected() 将被调用,但我无法在此方法中找到选定的行”——好点。 “你能给我在这种情况下的建议吗?” -- 如果您的上下文菜单选项发生在所有调用startActivity() 上,您可以将Intents 附加到每个菜单项,然后您就不需要onContextItemSelected()。或者,您可以在每个MenuItem 上调用setOnMenuItemClickListener(),然后您就不需要onContextItemSelected()
      • 再次感谢您的回复..在我的应用程序中,我在单击 menuitem 后调用了一个方法..您能告诉我如何使用 setOnMenuItemClickListener()..??
      • @Venu Gopal:从onCreateContextMenu() 致电setOnMenuItemClickListener(),作为定义菜单的一部分。您提供一个侦听器对象。您可以教该对象该菜单项所属的歌曲(例如,final 局部变量,自定义侦听器子类上的构造函数参数)。但是,我想借此机会再次强调我的建议,如果您希望有几十行,请将其转换为 ListView
      • @CommonsWare..我绝对听从你的建议。来到我的应用程序..我已经使用 MenuInflater 对象从 xml 资源加载菜单。现在告诉我如何使用 setOnMenuItemClickListener() 或者我将以编程方式创建菜单项然后分配此侦听器??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      相关资源
      最近更新 更多