Android 将数据从活动发送到选项卡片段

Android 将数据从活动发送到选项卡片段,android,android-fragments,tabs,Android,Android Fragments,Tabs,我的代码有一个lite问题,我在这个网站上搜索,但仍然没有找到最好的答案 我会将数据发送到我的标签片段,这是我的代码 我的活动课 public class MainActivity extends AppCompatActivity private ViewPager pager; private Toolbar toolbar; private TabLayout tabs; @Override protected void onCreate(Bu

我的代码有一个lite问题,我在这个网站上搜索,但仍然没有找到最好的答案 我会将数据发送到我的标签片段,这是我的代码

我的活动课

public class MainActivity extends AppCompatActivity 

    private ViewPager pager;
    private Toolbar toolbar;
    private TabLayout tabs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        pager=(ViewPager) findViewById(R.id.pager);
        tabs=(TabLayout) findViewById(R.id.tabs);

        pager.setAdapter(new TabFragmentPagerAdapter(getSupportFragmentManager()));
        tabs.setupWithViewPager(pager);
        tabs.setTabGravity(TabLayout.GRAVITY_FILL);

        Bundle bundle = new Bundle();
        bundle.putString("edttext", "data From Activity");
        // set Fragmentclass Arguments
        tab1Fragment fragobj = new tab1Fragment();
        fragobj.setArguments(bundle);

    }
}
public class tab1Fragment extends Fragment 

    public tab1Fragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view= inflater.inflate(R.layout.fragment_tab1, container, false);
        TextView tes=(TextView) view.findViewById(R.id.testtab1);
        String strtext = getArguments().getString("edttext");

        tes.setText("tes :"+ strtext);
        return  view;
    }
}
这是我的tab1类

public class MainActivity extends AppCompatActivity 

    private ViewPager pager;
    private Toolbar toolbar;
    private TabLayout tabs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        pager=(ViewPager) findViewById(R.id.pager);
        tabs=(TabLayout) findViewById(R.id.tabs);

        pager.setAdapter(new TabFragmentPagerAdapter(getSupportFragmentManager()));
        tabs.setupWithViewPager(pager);
        tabs.setTabGravity(TabLayout.GRAVITY_FILL);

        Bundle bundle = new Bundle();
        bundle.putString("edttext", "data From Activity");
        // set Fragmentclass Arguments
        tab1Fragment fragobj = new tab1Fragment();
        fragobj.setArguments(bundle);

    }
}
public class tab1Fragment extends Fragment 

    public tab1Fragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view= inflater.inflate(R.layout.fragment_tab1, container, false);
        TextView tes=(TextView) view.findViewById(R.id.testtab1);
        String strtext = getArguments().getString("edttext");

        tes.setText("tes :"+ strtext);
        return  view;
    }
}
这是我的页面片段适配器

public class TabFragmentPagerAdapter extends FragmentPagerAdapter 

    String[] title = new String[]{
            "Tab 1", "Tab 2", "Tab 3"
    };

    public TabFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position){
        Fragment fragment=null;
        switch (position){
            case 0:
                fragment=new tab1Fragment();
                break;
            case 1:
                fragment=new tab2Fragment();
                break;
            case 2:
                fragment=new tab3Fragment();
                break;
            default:
                fragment=null;
                break;
        }
        return  fragment;
    }
    @Override
    public  CharSequence getPageTitle(int position){
        return  title[position];
    }
    @Override
    public  int getCount(){
        return  title.length;
    }
}
当我运行错误时

java.lang.NullPointerException


请在您发送的
AppCompatActivity
中提供帮助

tab1Fragment fragobj = new tab1Fragment();
fragobj.setArguments(bundle);
但是在您的
选项卡FragmentPageRadapter

fragment=new tab1Fragment();
            break;
它有空参数

内部开关

switch (position){
    case 0:
      fragment=new tab1Fragment();               
      Bundle bundle = new Bundle();
      bundle.putString("edttext", "data From Activity");
      fragment.setArguments(bundle);
    break;

我想你可以先通过调用你的活动来启动Tab1Frame(),然后你可以这样做

用这个

而不是


可能是因为您的片段在
getItem
中再次初始化而没有参数,所以您得到的是
NullPointerException

这样试试

@Override
public Fragment getItem(int position){
    Fragment fragment=null;

    Bundle bundle = new Bundle();
    bundle.putString("edttext", "data From Activity");

    switch (position){
        case 0:
            fragment=new tab1Fragment();
            fragment.setArguments(bundle);
            break;
        case 1:
            fragment=new tab2Fragment();
            break;
        case 2:
            fragment=new tab3Fragment();
            break;
        default:
            fragment=null;
            break;
    }
    return  fragment;
}

注意:确保在MainActivity和tab1Fragment中导入相同版本的片段。

在片段中创建一个函数,以便从活动中传入数据,就像在对象类的
getters
setters
中所做的那样:

// Fragment
class TabFragment extends Fragment{

    public String myDataString;

    ...

    public void setTabInfo(String myActivityString){
        this.myDataString = myActivityString;
    }
}

// Activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ...

    TabFragment frag = new TabFragment();
    frag.setTabInfo("data From Activity");

}

我更喜欢这种方法,因为在对象的情况下使用
Bundle
时,您不必序列化对象,直接传递数据

可能是最晚的答案,但有一点对我有效:

将包发送到适配器:

  Bundle bundle = new Bundle();
  bundle.putString("edttext", "data From Activity");
  pager.setAdapter(new TabFragmentPagerAdapter(getSupportFragmentManager(), bundle));
在适配器中扩展构造函数:

Bundle bundle;

  public TabFragmentPagerAdapter(FragmentManager fm, Bundle bundle) {
    super(fm);
    this.bundle=bundle;
}
并将其发送到片段:

switch (position){
        case 0:
            fragment=new tab1Fragment();
            fragment.setArguments(bundle);
            break;
希望它能有所帮助。
}

你从哪里得到的NullPointerException,在哪一行号上,post log catpost你的错误登录我看到了,如果我把bundle放到tabframentpageadapter,数据就会输出到我的第一个选项卡。但问题是数据来自另一个活动,比如说来自cutomer活动,我很难将数据发送到我的选项卡FragmentPageRadapterCustomerActivity(将数据发送到)->MainActivity(我通过getinten获取数据)->发送到tab1fragment(这是我的问题)在MainActivity中写入TabFragmentPagerAdapter您可以使用bundle从fragment发送任何数据,您无需创建单独的类尝试更新answeFATAL异常:主进程:com.kenjin.tabfragmentapp,PID:23716 java.lang.NullPointerException位于android.support.v4.app.fragment.performCreateView上的com.kenjin.tabfragmentapp.fragment.tab1Fragment.onCreateView(tab1Fragment.java:32)(Fragment.java:1)