2

问题很简单,我对 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 的密钥是相同的。

关于到底发生了什么的任何想法?

4

5 回答 5

2
Bundle extras = getIntent().getExtras();
        if (extras != null) {
            extras = extras.getBundle("KEY_EXTRAS");
            String status = extras.getString("KEY_TEXT");
        }
于 2012-11-05T06:11:45.227 回答
1

In Activity A:

    Intent i = new Intent(MainActivity.this, AnotherActivity.class);
    Bundle b = new Bundle();
    b.putString("thisc", "my name");
    i.putExtra("bundle", b);
    startActivity(i);

In Activity B:

**Bundle bun = getIntent().getBundleExtra("bundle");

if (bun.containsKey("thisc")) {

Log.i("TAG", bun.getString("thisc"));

} else {

Log.i("TAG", "no thisc");

}**

Check the first line of code in Activity B, that's the main difference actually!!

于 2012-11-05T06:50:19.137 回答
1

尝试将额外变量添加到意图而不是 Bundle Ex 中:

 i.putExtra(KEY_1, a);
 i.putExtra(KEY_2, b);
 i.putExtra(KEY_3, c); 

然后从意图 Ex 的其他活动中检索它:

  getIntent().getStringExtra(KEY_1) ;
于 2012-11-05T06:16:04.840 回答
0

如果您希望从一个 Activity 共享到其他 Activity 的数据数量,则很难保持 Bundle 和 Bundle to Intent 的意图。

只需简单地将 IntentPuExtra() 与不同的参数一起使用。

您可以在意图中传递大量数据,例如:

发送方:

创建你的意图。

Intent My_Intent = new Intent(FromClass.this,ToClass.class);

添加您想与其他活动分享的价值。

My_Intent.putExtra("VAR_A",a_value);
My_Intent.putExtra("VAR_B",b_value);
My_Intent.putExtra("VAR_C",c_value);

打电话给你的意图。

StartActivity(My_Intent);

接收方:

Intent My_Intent = getIntent(); 
First_Value=My_Intent.getStringExtra("VAR_A");
Sec_Value=My_Intent.getStringExtra("VAR_B");
Thred_Value=My_Intent.getStringExtra("VAR_C");

我认为您可以轻松地将数据从一个 Activity 处理到另一个 Activity 。

于 2012-11-05T06:32:30.847 回答
0
//put value
    Intent inatent = new Intent(this,text.class);
    inatent_logo.putExtra("message","hello");
    startActivity(inatent);

//get vale
    String msg  = getIntent().getStringExtra("message").toString();
于 2012-11-05T06:22:33.143 回答