getIntent.getExtras()不返回null但没有值。

时间:2012-11-05 06:02:12

标签: android android-intent

问题很简单,我并不是Android的新手,但是对于我的生活,我不能检索从活动A到活动B的意图传递的额外内容。

参见活动A:这实际上是一个ListFragment,它实现onListItemClick()以通过intent启动另一个活动。

@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)));
    }
}

正如您所看到的,我相信我正在使用正确的代码来获取额外内容,在其他应用程序上使用相同的代码。不确定为什么,当通过intent创建ExpandedTweetView时,所有textView都是空的。请参阅:https://www.dropbox.com/s/pso6jbyn6rpks9n/empty_activity.png

更奇怪的是,我最初尝试通过调用此方法来检查捆绑包是否为空:

if (extras == null) {
Log.v(TAG, "Extras are empty :(");
}

但该行从未执行过,这意味着该bundle不是null。我还认为用于从包中检索单个字符串的键可能不匹配;但是,为了弥补这一点,我决定创建可以在双方使用的常量。正如您在代码中看到的那样,设置Extra的键和检索Extra的键都是相同的。

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

5 个答案:

答案 0 :(得分:1)

Bundle extras = getIntent().getExtras();
        if (extras != null) {
            extras = extras.getBundle("KEY_EXTRAS");
            String status = extras.getString("KEY_TEXT");
        }

答案 1 :(得分:1)

尝试将额外变量添加到intent而不是Bundle中 例如:

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

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

  getIntent().getStringExtra(KEY_1) ;

答案 2 :(得分:1)

在活动A中:

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

在活动B中:

** Bundle bun = getIntent()。getBundleExtra(“bundle”);

if(bun.containsKey(“thisc”)){

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

}其他{

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

} **

检查活动B中的第一行代码,实际上是主要区别 !!

答案 3 :(得分: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();

答案 4 :(得分:0)

如果你想要的数据数量从一个活动共享到其他活动,很难保持对Bundle和Bundle to Intent的意图。

只需使用具有不同参数的PuExtra()的Intent。

您可以在意图中传递数据:

发件人方:

创建您的意图。

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。