【问题标题】:SubActivity inside another SubActibity另一个子活动中的子活动
【发布时间】:2012-12-26 10:19:30
【问题描述】:

我正在开发一个 mediaPlayer 应用程序,我将 ListViews 用于我的播放列表。我有具有 mediaPlayer 的主要活动,当用户单击播放列表按钮时,将启动 ArtistActivity,用户可以从中启动 SongActivity。我查看了许多教程和示例,但由于某种原因,SongActivity 将“0”传递回主要活动并使用歌曲 URL 播放 ArrayList 中的第一首曲目。任何帮助将非常感激。请帮忙。谢谢你。

MainActivity:

    btnPlaylist.setOnClickListener(new View.OnClickListener() {


        public void onClick(View arg0) {
            Intent i = new  Intent(getApplicationContext(),ArtistActivity.class);
            startActivityForResult(i, 100);

        }
    });

}


protected void onActivityResult(int requestCode,
        int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == 50)
    {

        currentSongIndex = data.getExtras().getInt("songIndexArtist");

        songIndex = currentSongIndex;

        // play selected song
        playSong(currentSongIndex);

        // Displaying Song title
        String songTitle =
  songsList.get(currentSongIndex).get("songTitle");
        songTitleLabel.setText(songTitle);

    }

艺术家活动:

lv.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            //int artistIndex = position;

            // Starting new intent
            Intent in2 = new Intent(getApplicationContext(),SongActivity.class);

            startActivityForResult(in2,100);

            setResult(100,in2);

            in2.putExtra("songIndexArtist", songIndexArtist);

            finish();

        }
    });
}
protected void onActivityResult(int requestCode,
        int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == 50)
    {

        songIndexArtist = data.getExtras().getInt("songIndex");

    }

}

SongActivity:

lv.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {


            Toast.makeText(getApplicationContext(), "DOWNLOADING, PLEASE WAIT", Toast.LENGTH_LONG).show(); 

            // getting listitem index
            int songIndex = position;

            // Starting new intent
            Intent in3 = new Intent(getApplicationContext(),
                    AndroidBuildingMusicPlayerActivity.class);

            // Sending songIndex to PlayerActivity
            in3.putExtra("songIndex", songIndex);

            setResult(50,in3);

            // Closing PlayListView
            finish();
        }
    });
}

【问题讨论】:

  • 你应该为此使用 Fragments!

标签: android listview subactivity


【解决方案1】:

您混合了requestCoderesultCoderesultCode 应该是预定义常量 RESULT_CANCELEDRESULT_OKRESULT_FIRST_USER 等之一。requestCode 是您的唯一值 - 50、100 等。

此外,startActivityForResult 调用中的 requestCode 和同一活动中的 onActivityResult 处理程序中的 requestCode 应该相同。

例如,在 SongActivity 中您应该调用:

setResult(RESULT_OK, in3);

ArtistActivity 中您应该调用:

startActivityForResult(in2, 50);

因为您在 ArtistActivity 中的 onActivityResult 等待代码 50。

lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Intent in2 = new Intent(getApplicationContext(), SongActivity.class);

            // Starting SongActivity and wait for results with requestCode 50
            startActivityForResult(in2, 50);
        }
    });
}

protected void onActivityResult(int requestCode,
        int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 50 && resultCode == RESULT_OK)
    {
        // get results from SongActivity (requestCode = 50)
        songIndexArtist = data.getExtras().getInt("songIndex");

        // now pass the same data into MainActivity
        Intent result = new Intent();
        result.putExtra("songIndexArtist", songIndexArtist);
        setResult(RESULT_OK, result);
        finish();
    }
}

请注意,我将 resultCode 替换为 requestCode。

您应该以类似的方式修复 MainActivity

你也可以使用FLAG_ACTIVITY_FORWARD_RESULT flag;有一个相关的SO question 和一个good explanation of this flag(以及其他标志)。如果您“按原样”将结果通过中间活动传回而不进行任何处理,则该标志很有用。

【讨论】:

  • 谢谢 Stan 我修复了 requestcode 和 resultcode 混淆但由于某种原因 ArtistActivity 仍在将“0”传递给 MainActivity。我尝试使用 Log.i 进行调试,但我无法弄清楚它从哪里得到“0”。 Log.i(getPackageName(), "mainActivity 中的结果代码:"+resultCode); Log.i(getPackageName(), "mainActivity中的请求代码:"+requestCode);
  • 我在 SongActivity 类中再次检查,位置对应于我选择的任何行,但是当它传递回 MainActivity 时,它变为“0”。
  • 问题解决了吗?确保在 ArtistActivity 中将行 setResult(RESULT_OK, result); result.putExtra("songIndexArtist", songIndexArtist); finish(); 移动到 onActivityResult 以响应已完成的 SongActivity。请注意,result 必须是一个新意图:Intent result = new Intent(); 专门分配用于将数据传回主活动 - 不要将其与用于调用 SongActivity 的意图混合。我已经更新了答案。如果问题仍然存在,您可能应该发布更新的代码,以便更轻松地了解当前情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多