【问题标题】:Passing data beetwen fragments in viewpager在 viewpager 中的片段之间传递数据
【发布时间】:2015-04-19 14:15:50
【问题描述】:

我的 Viewpager 有 2 个片段:CurrentWeatherFragmentForecastFragment。我需要将字符串从一个传递到另一个,我使用如下界面,但我不断收到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);
}
}

我已在其他应用程序中成功使用此方法,其中我在一个活动中有 2 个片段,我可以通过 ID 调用它们

public void sendData(String message) {

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

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

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    虽然有点 hacky,但您可以使用以下代码通过其标签获取片段:

    String tag = "android:switcher:" + R.id.pager + ":" + index;
    Fragment f = getSupportFragmentManager().findFragmentByTag(tag);
    

    其中 R.id.pager 是布局中 viewpager 的 id,index 是 Viewpager Adapter 中的位置(作为整数)。 我不能说这将永远有效,但它目前对我有效。

    我建议的替代方案是使用 LocalBroadcastManager 和 BroadcastReciver 在您的片段之间内部发送数据,尽管它需要做更多的工作,但它有助于摆脱意大利面条式代码的情况,您最终可能会发现自己在尝试引用片段时直接。

    【讨论】:

      【解决方案2】:

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

      注意不要覆盖默认构造函数,而是创建一个静态方法 getInstance(String data)。

      public static YourClass getInstance(String data) 
      {
          YourClass object = new YourClass();
          Bundle bundle =  new Bundle();
          bundle.putString(key, data);
          object.setArguments(bundle);  
      
          return object;
      }
      

      然后就可以通过getArguments()获取fragment的onCreate方法中的数据了

      【讨论】:

      • 这是正确的做法!
      • 这不能回答问题。
      【解决方案3】:

      对于像我这样寻找片段到 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");
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多