【问题标题】:Sending SongIndex through Intent通过 Intent 发送 SongIndex
【发布时间】:2016-07-08 09:39:42
【问题描述】:

我正在创建一个音乐播放器。我想从 ListView 播放一首选定的歌曲。但是当我点击列表视图中的特定项目(歌曲)时。我没有得到我在二等舱点击的项目(歌曲)。播放器总是从列表中选择第一首歌曲并播放第一首歌曲。我认为代码中存在问题。请检查并更正。谢谢

Tab1(发送类)

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    int songIndex = position;

    // Starting new intent
    Intent in = new Intent(getActivity(), NowPlaying.class);
    // Sending songIndex to PlayerActivity
    in.putExtra("songIndex", songIndex);
    getActivity().setResult(100, in);
    // Closing PlayListView
    getActivity().finish();
    startActivity(in);
}

NowPlaying(接收类)

 /**
 * Receiving song index from playlist view
 * and play the song
 */
@Override
protected void onActivityResult(int requestCode,
                                int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 100) {
        currentSongIndex = data.getExtras().getInt("songIndex");
        // play selected song
        playSong(currentSongIndex);
    }

}

【问题讨论】:

  • 这两类是不同的应用程序吗?你为什么不通过一个额外的意图?无论如何,你没有开始ForResult。有点混乱
  • NowPlaying.class 中的 onCreate 方法是什么样的?
  • @user6547359 这两个类属于同一个应用程序。在第一堂课中,歌曲被加载到 listView 中。当我点击任何歌曲时,接收 songIndex 的类不会播放该歌曲。
  • @AkshaySharma 可能是因为你的结果永远不会是 100。像处理索引一样额外传递它,并在 oncreate (或恢复)中启动它。当您为结果启动活动时,您希望启动的活动返回结果,反之亦然。

标签: android android-intent


【解决方案1】:

这可能对你有帮助 https://developer.android.com/training/basics/intents/result.html

从第一个活动开始,您需要调用startActivityForResult() 而不是startActivity()。之后不要在此活动上致电finish()

从将要返回结果的活动中,您只需在完成使用finish() 之前设置结果,活动不要调用startActivity() 来调用旧活动。

不要在第二个活动中为意图构造函数使用类名。用户默认意图构造函数

【讨论】:

    【解决方案2】:

    要传递歌曲的位置

    Tab1

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
    
        Intent in = new Intent(getActivity(), NowPlaying.class);
        in.putExtra("songIndex", position);
        startActivity(in);
        getActivity().finish();
    
    }
    

    NowPlaying(接收类)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_name); //insert here you activity's xml layout
        currentSongIndex = getExtras().getInt("songIndex"); 
     // currentSongIndex now holds an integer value, the position of the song selected from your list. After that you should call your function to play the specific song
    }
    

    【讨论】:

    • 如果出于任何原因需要,请在附加项中添加 100 个“结果”。
    【解决方案3】:

    看到有两件事:

    1. 如果您想通过Intent 对象传递它并希望在另一个类中接收它,您需要在onCreate 中接收它,如下所示:

      In NowPlaying(接收类)

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          currentSongIndex = getIntent().getStringExtra("songIndex");               
      }
      
    2. 如果您想在onActivityResult 中执行此操作,那么您的NowPlaying 活动必须以Tab1ActivitystartActivityForResult() 开始。并且无需在Tab1onListItemClick 中开始活动


    编辑:

    你需要理解我猜的区别:Difference between startActivityForResult() and startActivity()?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多