将带有来自 activity 的额外字符串的意图发送到选项卡片段

send intent with extrastring from activity to tab fragment

我的应用程序的 activity 层次结构是: MainActivity > FragActivity > FragmentExp(它包括 3 个选项卡片段(Tab1 Tab2 Tab3))

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

我试过的是: 我像这样从 MainActivityFragActivity 设置了 extrastring 的意图。

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

并直接在 Tab1Tab2 中获取这些字符串,如下所示:
Tab1

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

这些是我的代码:

MainActivity:

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

FragActivity:

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 中,我设置了 tablayout 并在其中包含 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;
        }
    }

像下面的函数一样获取片段实例。 这种获取实例的方式确保所有客户端都需要 instance构造Fragment的过程相同

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
}

顺便说一句,如果"code"是动态的,那就完全不一样了。