问题很简单,我对 Android 并不完全陌生,但在我的一生中,我无法检索通过意图从 Activity A 传递到 Activity B 的额外内容。
参见 Activity A:这实际上是一个 ListFragment,它实现了 onListItemClick() 以通过一个意图启动另一个 Activity。
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Log.i("FragmentList", "Item clicked: " + id);
Intent i = new Intent(getActivity(), ExpandedTweetView.class);
twitter4j.Status status = adapter.getItem(position);
Bundle extras = new Bundle();
extras.putString(KEY_TEXT, status.getText());
extras.putString(KEY_HANDLE, status.getUser().getScreenName());
extras.putString(KEY_NAME, status.getUser().getName());
extras.putString(KEY_TIMESTAMPS, status.getCreatedAt().toString());
extras.putLong(KEY_RETWEETS, status.getRetweetCount());
i.putExtra(KEY_EXTRAS, extras);
startActivity(i);
}
这部分工作正常,我使用 Log.v(TAG, "status.getText()" 对其进行了测试,以确保错误不是来自适配器通过 getItem() 传递一个空项目。
这是活动B的代码:
public class ExpandedTweetView extends Activity {
TextView text;
TextView name;
TextView handle;
TextView createdAt;
TextView retweets;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.expanded_list_item);
Bundle extras = getIntent().getExtras();
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
text = (TextView) findViewById(R.id.h_content);
name = (TextView) findViewById(R.id.h_name);
handle = (TextView) findViewById(R.id.h_handle);
createdAt = (TextView) findViewById(R.id.h_timestamp);
retweets = (TextView) findViewById(R.id.h_retweet_count);
if(extras != null) {
text.setText(extras.getString(TimelineFragment.KEY_TEXT));
name.setText(extras.getString(TimelineFragment.KEY_NAME));
handle.setText(extras.getString(TimelineFragment.KEY_HANDLE));
createdAt.setText(extras.getString(TimelineFragment.KEY_TIMESTAMPS));
retweets.setText(String.valueOf(extras.getLong(TimelineFragment.KEY_RETWEETS)));
}
}
如您所见,我相信我使用正确的代码来获取附加功能,在其他应用程序上使用相同的代码。不知道为什么,当通过意图创建 ExpandedTweetView 时,所有的 textView 都是空的。请参阅:https ://www.dropbox.com/s/pso6jbyn6rpks9n/empty_activity.png
更奇怪的是,我最初尝试通过调用以下命令来检查捆绑包是否为空:
if (extras == null) {
Log.v(TAG, "Extras are empty :(");
}
但是该行从未执行过,这意味着捆绑包不为空。我还认为可能用于从包中检索单个字符串的键不匹配;然而,为了解决这个问题,我决定创建可以在双方使用的常量。正如您在代码中看到的,设置 Extra 的密钥和检索 Extra 的密钥是相同的。
关于到底发生了什么的任何想法?