【问题标题】:Intent extras are null after starting new activityIntent extras 在开始新活动后为空
【发布时间】:2017-08-29 01:33:20
【问题描述】:

从调试中我可以看到,当调用startActivity(Intent) 时,附加功能实际上是在意图中。但是,一旦在新活动中调用getIntent(),附加功能就消失了。在我添加 AsyncTask 来处理长计算之前,意图的附加功能很好。

下面是启动新活动RecipeListActivity的代码

public class Fragment extends android.support.v4.app.Fragment {
private Entity mEntity;

 private class RecipeOperation extends AsyncTask<Void, Void, ArrayList<Recipe>> {
    Context mContext;

    public RecipeOperation(Context context){
        mContext = context;
    }

    @Override
    protected  void onPreExecute(){
        // set gui visibilities
    }

    @Override
    protected ArrayList<Recipe> doInBackground(Void... param) {
        // long computation
    }

    @Override
    protected void onPostExecute(ArrayList<Recipe> result) {
        //start activity
        Intent i = RecipeListActivity.newIntent(mContext, mEntity.getName(), result);
        mContext.startActivity(i);
    }
}

}
RecipeOperation 任务是这样执行的

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new RecipeOperation(getActivity()).execute();
        }
    });

下面是我开始的活动

public class RecipeListActivity extends SingleFragmentActivity {
private static final String EXTRA_NAME = "name";
private static final String RECIPES_TAG = "Recipes";

@Override
protected Fragment createFragment(){
    String Name = getIntent().getExtras().getString(EXTRA_NAME);
    ArrayList<Recipe> recipes = getIntent().getExtras().getParcelableArrayList(RECIPES_TAG);
    return RecipeListFragment.newInstance(Name,recipes);
}

public static Intent newIntent(Context packageContent, String Name, ArrayList<Recipe> recipes){
    Intent intent = new Intent(packageContent,RecipeListActivity.class);
    intent.putExtra(EXTRA_NAME, Name);
    intent.putParcelableArrayListExtra(RECIPES_TAG,recipes);
    return intent;
}

}

这是RecipeListActivity的超类

public abstract class SingleFragmentActivity extends AppCompatActivity {
protected abstract Fragment createFragment();

@LayoutRes
protected int getLayoutResId(){
    return R.layout.activity_masterdetail;
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(getLayoutResId());
    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentById(R.id.fragment_container);
    if (fragment == null) {
        fragment = createFragment();
        fm.beginTransaction()
                .add(R.id.fragment_container, fragment)
                .commit();
    }
}

}

在开始新活动时,意图的附加内容发生了什么变化?如何让附加内容持续存在?

【问题讨论】:

  • onCreate() 属于超类 SingleFragmentActivity
  • 你在里面设置断点了吗?
  • 我在问题中添加了SingleFragmentActivity。我在该类中设置了一个断点,并且那里的附加项也为空。
  • 也许您的 Fragment 正在以某种方式重新创建该 Activity。所以,你可以尝试在片段中添加setRetainInstance(true)

标签: android android-intent


【解决方案1】:

事实证明,intent 的 extras 为空,因为在我的实现 ParcelableRecipe 类中存在错误。本质上,我的parcel.write 命令与我的parcel.read 命令不匹配。 因此,如果其他人有此问题,请检查您的包裹。在下一个活动开始并调用 getIntent 时,将未正确实现的 Parcelable 放入 Intent 将使所有额外内容无效。

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2018-04-11
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多