Android 在viewpager中传递数据片段

Android 在viewpager中传递数据片段,android,android-viewpager,Android,Android Viewpager,我用两个片段查看了寻呼机:CurrentWeatherFragment和ForecastFragment。我需要将字符串从一个传递到另一个,我使用下面这样的接口,但我一直得到NullPointerException,消息没有正确传递 public class CurrentWeatherFragment extends Fragment { SendMessage SM public void onCreateView(...) { String Message = "Hello" SM.s

我用两个片段查看了寻呼机:
CurrentWeatherFragment
ForecastFragment
。我需要将字符串从一个传递到另一个,我使用下面这样的接口,但我一直得到
NullPointerException
,消息没有正确传递

public class CurrentWeatherFragment extends Fragment {

SendMessage SM

public void onCreateView(...) {
String Message = "Hello"
SM.sendData(Message);
}

interface SendMessage
{
    public  void sendData(String message);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        SM = (SendMessage) activity;
    } catch(ClassCastException e) {
        throw  new ClassCastException("Musisz zaimplementowac metode sendData");
    }
}
}
MainActivity.java

import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.os.Bundle;


public class MainActivity extends FragmentActivity implements CurrentWeatherFragment.SendMessage {

ViewPager viewPager;


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

    //setting fragment view pager
    viewPager = (ViewPager)findViewById(R.id.pager);
    PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
}

public void sendData (String message){
    ForecastFragment FF = new ForecastFragment();
    FF.getData(message);
}

}
ForecastFragment.java

public class ForecastFragment extends Fragment {

public View onCreateView(){
TextView txt = (TextView)v.findViewById(R.id.txt_forecast);
}

public void getData(String message){
        txt.setText(message);
}
}
我已经在其他应用程序中成功地使用了这种方法,我在一个活动中有两个片段,我可以通过ID调用它们

public void sendData(String message) {

    SecondFragment f2 = (SecondFragment)getFragmentManager().findFragmentById(R.id.F2);
    f2.getData(message);
}

但是这里片段没有ID,我认为消息没有传递,因为我没有使用
FragmentManager()
,但是如何在没有ID的viewpager中找到片段,有什么建议/想法吗?

要在片段之间传递数据,需要在对象构造函数中传递数据

请注意不要重写默认构造函数,而是创建一个静态方法getInstance(字符串数据)


然后,您可以使用getArguments()在片段的onCreate方法中获取数据。

,尽管您可以使用以下代码通过标记获取片段:

String tag = "android:switcher:" + R.id.pager + ":" + index;
Fragment f = getSupportFragmentManager().findFragmentByTag(tag);
其中R.id.pager是布局中的viewpager的id,index是viewpager适配器中的位置(作为整数)。 我不能说这将永远有效,但目前它对我有效


我建议的另一种选择是使用LocalBroadcastManager和BroadcastReceiver在片段之间内部发送数据,尽管这需要做更多的工作,但它有助于摆脱意大利面代码的情况,您最终可能会发现自己试图直接引用片段。

对于像我这样正在查找用于向viewpager发送片段数据

以下是工作解决方案:

将数据从片段发送到选项卡布局的视图页导航的片段:

在主要片段中:

对于选项卡布局,我使用了两个片段

1) BillDetailFragment和

2) ClientDepMonFragment

private TabLayout tabLayout;
    private ViewPager viewPager;


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


// adding  fragment and passing data to it
        BillDetailFragment billDetailFragment=new BillDetailFragment();
        Bundle bundle=new Bundle();
        bundle.putString("mobile",mobile);
        bundle.putInt("c_id",client_id);
        bundle.putInt("server_id",server_id);
        billDetailFragment.setArguments(bundle);

        ClientDepMonFragment clientDepMonFragment=new ClientDepMonFragment();
        Bundle bundle1=new Bundle();
        bundle1.putString("mobile",mobile);
        bundle1.putInt("c_id",client_id);
        bundle1.putInt("server_id",server_id);
        clientDepMonFragment.setArguments(bundle1);


        tabLayout=(TabLayout)view.findViewById(R.id.detail_txn_tab_layout);
        viewPager=(ViewPager)view.findViewById(R.id.detail_txn_viewpager);
        dtViewPagerAdapter=new DtViewPagerAdapter(getChildFragmentManager(),DetailFragment.this);

        dtViewPagerAdapter.addFragments(billDetailFragment,"Lending Money");
        dtViewPagerAdapter.addFragments(clientDepMonFragment,"Deposited Money");
        viewPager.setAdapter(dtViewPagerAdapter);
        tabLayout.setupWithViewPager(viewPager);
}
下面是如何从片段中访问数据

BillDetailFragment:重写onCreate方法

        private int client_id,server_id;
        private String client_mobile;
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            client_mobile=getArguments().getString("mobile");
            client_id=getArguments().getInt("c_id");
            server_id=getArguments().getInt("server_id");
        }

这是正确的做法!这并不能回答问题。
        private int client_id,server_id;
        private String client_mobile;
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            client_mobile=getArguments().getString("mobile");
            client_id=getArguments().getInt("c_id");
            server_id=getArguments().getInt("server_id");
        }