将带有额外字符串的意图从活动发送到选项卡片段



我的应用的活动层次结构为: MainActivity> FragActivity> FragmentExp(它包括3个选项卡片段(Tab1Tab2Tab3((

我在MainActivity中有回收器视图,当单击不同的列表时,我想使用额外的字符串转到Tabs(我的意思是一些字符串消息(。并且,在这些选项卡中显示吐司。

我尝试的是: 我用我MainActivity的外线设定了意图,像这样FragActivity

if (position==1){
Intent i = new Intent(MainActivity.this, FragActivity.class);
i.putExtra(MainActivity.ENGLISHPDF, "0");
startActivity(i);
}

并直接在Tab1中获取这些字符串,并像这样Tab2
InTab1

code = getActivity().getIntent().getStringExtra(MainActivity.ENGLISHPDF);
if (this.code.equals("0")) {
Toast.makeText(getContext(), "hey its 1", Toast.LENGTH_SHORT).show();
}

Tab2

code = getActivity().getIntent().getStringExtra(MainActivity.ENGLISHPDF);
if (this.code.equals("0")) {
Toast.makeText(getContext(), "hey its 2", Toast.LENGTH_SHORT).show();
}

这些是我的代码:

主要活动

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, DataAdapter.OnNoteListener{
public static final String ENGLISHPDF = "english";
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
(...)
recyclerView = findViewById(R.id.add_header);
(...)
ArrayList<ListItem> items =  new ArrayList<>();
items.add(new Item(R.drawable.green, "English", "1"));
DataAdapter adapter = new DataAdapter(items, this);
recyclerView.setAdapter(adapter);
}
@Override
public void onNoteClick(int position) {
if (position==0){
Intent i = new Intent(MainActivity.this, FragActivity.class);
i.putExtra(MainActivity.ENGLISHPDF, "0");
startActivity(i);
}
}
}

弗拉格活动

public class FragActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frag);

getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,
new FragmentExplorem(), COLLAPSING_TOOLBAR_FRAGMENT_TAG).commit();

}

最后,在 FragExp 中,我设置了选项卡布局并在其中包含 3 个选项卡片段。 这是FragExp:

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_layout, container, false);
AppBarLayout appBarLayout = view.findViewById(R.id.tab_appbar_layout);
((CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams()).setBehavior(new AppBarLayoutBehavior());
tabLayout = view.findViewById(R.id.tabs);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
viewPager = view.findViewById(R.id.viewpager);
viewPager.setOffscreenPageLimit(tab_count);
toolbar = view.findViewById(R.id.toolbar);
setupToolbar();
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
viewPager.setCurrentItem(0);
}
});
return view;
}
public class MyAdapter extends FragmentPagerAdapter {
private MyAdapter(FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0: return new Tab1();
case 1: return new Tab2();
case 2: return new Tab3();
}
return null;
}
@Override
public int getCount() {
return tab_count;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0 : {
return "First";
}
case 1 : {
return "Second";
}
case 2 : {
return "Third";
}
return null;
}
}

获取片段实例,如以下函数。 这种获取实例的方式确保所有客户端都需要 实例具有构建片段的相同过程。

public class Tab1 extends Fragment {
private static final String KEY_CODE = "key_code";
public static Fragment newInstance(@Nullable String code) {
Bundle args = new Bundle(1);
if (code!= null)
args.putString(KEY_CODE, code);
Tab1 fragment = new Tab1();
fragment.setArguments(args);
return fragment;
}
}

当您需要 Tab1 实例时,应同时传递参数或 null。

@Override
public Fragment getItem(int position) {
switch (position) {
case 0: return Tab1.newInstance(code);
case 1: return Tab2.newInstance(code);
case 2: return Tab3.newInstance(code);
}
return null;
}

然后,您可以通过调用 Fragment.getArguments(( 来使用代码。

// In Tab1
private String mCode;
private String DEFAULT_CODE = "0";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCode = getArguments().getString(KEY_CODE , DEFAULT_CODE);
// Now you can use the mCode in any place in Tab1 you want, but make sure you do Null check before using it
}

顺便说一句,如果"代码"是动态的,那么它将完全不同。

最新更新