如何将字符串从 activity 传递到 android 中选项卡式 activity 的片段

How to pass a String from an activity to fragment of a tabbed activity in android

在问之前我已经经历过类似的问题并尝试过但没有成功,每次都以空指针异常结束。 我想要做的就是将字符串中的用户名从一个 activity 传递到我的选项卡 activity 的另一个片段。 这是我尝试过的,我的主要 activity 代码

Bundle bundle = new Bundle();
                bundle.putString("NAME", username);
                //PASS OVER THE BUNDLE TO OUR FRAGMENT
                ProfileFragment profileFragment = new ProfileFragment();
                profileFragment.setArguments(bundle);

                startActivity(new Intent(MainActivity.this, TabbedAct.class));

以及来自 ProfileFragment 的代码

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_profile, container, false);

    profilename = (TextView) rootView.findViewById(R.id.profile);

    String name= this.getArguments().getString("NAME");

    profilename.setText(name);

    return rootView;
}

因为ProfileFragment还不可见。您开始的是 Activity 而不是片段。

首先,您需要为 TabbedAct 设置额外值

Intent intent = new Intent(MainActivity.this, TabbedAct.class);
intent.putExtra("Name", username);
startActivity(intent);

然后,在 TabbedAct Activity 中,您需要初始化 ProfileFragment

String username = getIntent().getStringExtra("Name");
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

.....
viewpager.setAdapter(viewPagerAdapter);
viewpager.setCurrentItem(0);
viewPagerAdapter.notifyDataSetChanged();

以及来自 ProfileFragment 的代码

public static ProfileFragment newInstance(String username) {
    ProfileFragment f = new ProfileFragment();
    Bundle bdl = new Bundle();
    bdl.putString("NAME", username);
    f.setArguments(bdl);
    return f;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_profile, container, false);

    profilename = (TextView) rootView.findViewById(R.id.profile);

    String name= this.getArguments().getString("NAME");

    profilename.setText(name);

    return rootView;
}

如果你没有 ViewPagerAdapter。你可以用我的

viewPagerAdapter.addFragment(,);
viewPagerAdapter.addFragment(,"Tab2");
viewPagerAdapter.addFragment(Fragment2.newsIntance(),"Tab3");

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private final String username;

    public ViewPagerAdapter(FragmentManager fragmentManager, String username) {
        super(fragmentManager);
        this.username = username;
    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0) return ProfileFragment.newInstance(username);
        if(position == 1) return Fragment2.newsIntance();
        if(position == 2) return Fragment3.newsIntance();

        throw new IllegalStateException("Unexpected position " + position);
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if(position == 0) return "Tab1";
        if(position == 1) return "Tab2";
        if(position == 2) return "Tab3";
      
        throw new IllegalStateException("Unexpected position " + position);
    }
}