如何将 onNewIntent 值传递给 Fragment?
How to Pass onNewIntent value to Fragment?
我想将意图值传递给片段,现在在 activity 我通过 onNewIntent 获取意图值,但我通过 Bundle 将意图值传递给片段,但它不起作用。
* MainActivity.java *
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
parseMessage = intent.getStringExtra("message");
if (parseMessage.length()>0) {
Bundle bundle = new Bundle();
bundle.putString("parseJson", parseMessage);
AbcdFragment activityFrag = new AbcdFragment();
activityFrag.setArguments(bundle);
}
}
@SuppressLint("DefaultLocale")
public class AllPagerAdapter extends FragmentPagerAdapter {
public AllPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position){
case 0:
return AbcdFragment.newInstance(getApplicationContext());
case 1:
return HelloFragment.newInstance(getApplicationContext());
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
return CONTENT[position].toUpperCase();
}
@Override
public int getCount() {
return 2;
}
}
* AbcdFragment.java *
public class AbcdFragment extends Fragment{
public static AbcdFragment newInstance(Context context) {
AbcdFragment fragment = new AbcdFragment();
fragment.context = context;
return fragment;
}
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.abcd_activity,container,false);
try {
parseJsonRes = getArguments().getString("parseJson");
Log.d("ParseActivityMsg", parseJsonRes);
} catch (Exception e) {
e.printStackTrace();
}
return view;
}
}
这是一个 viewpager 片段,我想将 intent 值传递给 AbcdFragment,但我在 AbcdFragment 中得到的是空值。
请仔细检查我的代码并提出一些解决方案
看看您是如何在视图寻呼机中创建片段的return AbcdFragment.newInstance(getApplicationContext());
然后看看你对AbcdFragment.newInstance
的实现
public static AbcdFragment newInstance(Context context) {
AbcdFragment fragment = new AbcdFragment();
fragment.context = context;
return fragment;
}
在 return AbcdFragment.newInstance()
中,您必须为您在该方法中创建的片段设置参数。此外,您甚至没有使用您在 onNewIntent 中创建的片段,您只是在创建它而不对其进行任何操作。
此外,如果调用 onNewIntent,MainActivity 可能已经处于活动状态,因此 AbcdFragment 可能已经在内存中,因此不会调用 getItem 并且不会使用新参数创建 newInstance,如果说得通。因为您的 ViewPager 中只有 2 个片段,所以一旦第一次创建它们,它们将存储在内存中,而不是每次在两者之间切换时都重新创建。
因此,如果您想坚持当前的实现,则必须在 AbcdFragment.newInstance
中设置参数并确保在 onNewIntent 之后创建片段的新实例。这可能不是获取片段数据的最佳方式。
我想将意图值传递给片段,现在在 activity 我通过 onNewIntent 获取意图值,但我通过 Bundle 将意图值传递给片段,但它不起作用。
* MainActivity.java *
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
parseMessage = intent.getStringExtra("message");
if (parseMessage.length()>0) {
Bundle bundle = new Bundle();
bundle.putString("parseJson", parseMessage);
AbcdFragment activityFrag = new AbcdFragment();
activityFrag.setArguments(bundle);
}
}
@SuppressLint("DefaultLocale")
public class AllPagerAdapter extends FragmentPagerAdapter {
public AllPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position){
case 0:
return AbcdFragment.newInstance(getApplicationContext());
case 1:
return HelloFragment.newInstance(getApplicationContext());
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
return CONTENT[position].toUpperCase();
}
@Override
public int getCount() {
return 2;
}
}
* AbcdFragment.java *
public class AbcdFragment extends Fragment{
public static AbcdFragment newInstance(Context context) {
AbcdFragment fragment = new AbcdFragment();
fragment.context = context;
return fragment;
}
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.abcd_activity,container,false);
try {
parseJsonRes = getArguments().getString("parseJson");
Log.d("ParseActivityMsg", parseJsonRes);
} catch (Exception e) {
e.printStackTrace();
}
return view;
}
}
这是一个 viewpager 片段,我想将 intent 值传递给 AbcdFragment,但我在 AbcdFragment 中得到的是空值。
请仔细检查我的代码并提出一些解决方案
看看您是如何在视图寻呼机中创建片段的return AbcdFragment.newInstance(getApplicationContext());
然后看看你对AbcdFragment.newInstance
public static AbcdFragment newInstance(Context context) {
AbcdFragment fragment = new AbcdFragment();
fragment.context = context;
return fragment;
}
在 return AbcdFragment.newInstance()
中,您必须为您在该方法中创建的片段设置参数。此外,您甚至没有使用您在 onNewIntent 中创建的片段,您只是在创建它而不对其进行任何操作。
此外,如果调用 onNewIntent,MainActivity 可能已经处于活动状态,因此 AbcdFragment 可能已经在内存中,因此不会调用 getItem 并且不会使用新参数创建 newInstance,如果说得通。因为您的 ViewPager 中只有 2 个片段,所以一旦第一次创建它们,它们将存储在内存中,而不是每次在两者之间切换时都重新创建。
因此,如果您想坚持当前的实现,则必须在 AbcdFragment.newInstance
中设置参数并确保在 onNewIntent 之后创建片段的新实例。这可能不是获取片段数据的最佳方式。