通过addFragment()传递变量

时间:2017-03-08 07:07:13

标签: java android fragment

我有一个Tab布局,在我的主要活动中通过适配器添加了标签。我需要通过addFrag传递一个变量(因为每个json条目创建每个frag)。见下文;

主要活动 - FragmentPagerAdapter

static class Adapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public Adapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

主要活动 - 制表符

    Adapter adapter = new Adapter(getSupportFragmentManager());
    adapter.addFragment(new DashboardTabs(), "Home");
    adapter.addFragment(new TeamsNewTabs(), "Teams" + _teamCount + "");
    adapter.addFragment(new FixturesNewTabs(), "Fixtures" + _fixturesCount + "");
    adapter.addFragment(new ResultsNewTabs(), "Results"+ _resultsCount + "");

    //send var through to the fragment like so ...
    //not sure how to get the "var" to even pass through ...
    String var = "my Tab Name";
    adapter.addFragment(new MyFragment(var), var);


    viewPager.setAdapter(adapter);

MyFragment - 访问时获取var。

    public class MyFragment extends Fragment {

    //not sure how to get the var or if it even passes through ...
    private getVar = var;

    }

在这种情况下是否可以做到这一点,或者我认为这是错误的方式。

4 个答案:

答案 0 :(得分:0)

像这样:在提交片段之前:

pop

在片段中:

Bundle b=new Bundle();
        b.putInt("cid",44);
        b.putString("title","name");
        fragment.setArguments(b);

答案 1 :(得分:0)

传递值:

        Bundle bundle1 = new Bundle();
        bundle1.putSerializable("var","my Tab Name");

        Fragment fragment = new MyFragment();
        fragment.setArguments(bundle1);
        adapter.addFragment(fragment);

MyFragment:

         public class MyFragment extends Fragment {

         .
         .
         .
             //get value
             if(getActivity().getArguments().getStringExtra("var")!=null)
            {
                String var_value=getActivity().getArguments().getStringExtra("var");
            }

       }

答案 2 :(得分:0)

使用参数包更新您的方法。像这样:

public void addFragment(Fragment fragment, String title, Bundle args) {
    fragment.setArguments(args);
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
 }

现在将其用作:

Bundle argsBundle=new Bundle();
argsBundle.putString("data","your_data");
adapter.addFragment(new MyFragment(var), var, argsBundle); //while adding fragment.

onCreateView()的{​​{1}}内部

MyFragment.java

快乐的编码。

答案 3 :(得分:0)

每个Parcelable对象都可以通过Bundle传递给片段或活动。是的,您可以通过fragment 构造函数传递您的String变量值但这不是一个好习惯。我告诉你原因 -

如果Android决定稍后重新创建Fragment,它将调用片段的无参数构造函数。所以重载构造函数不是一个解决方案。

话虽如此,将内容传递给Fragment以便在Android重新创建Fragment后可用的方法是将包传递给{{1 }} 方法。

所以,如果我们想将一个String传递给片段,我们会使用类似的东西:

setArguments

在片段public static DashboardTabs newInstance(String someString) { DashboardTabs mF = new DashboardTabs(); Bundle args = new Bundle(); args.putString("key_string", someString); mF.setArguments(args); return mF; } 中,您可以使用以下命令访问onCreate() String

getArguments().getString("key_string", "");

加点,如果重新创建片段,您的Bundle仍然可用。

最后,您的addFragment方法可用作 -

adapter.addFragment(DashboardTabs.newInstance(yourStringValue), "Home");

方法来自 - SO linkOfficial documentation