繁体   English   中英

如何在Viewpager片段之间同步数据

[英]How to Synchronize Data Between Viewpager Fragments

使用以下代码,我可以单击一个按钮,以将一个片段(片段A)中的字符串发送到MainActivity中。 如何从MainActivity检索字符串并将其一次性显示在片段B上? 我希望片段能同步执行; 单击片段A中的按钮,使片段B自行更新。我似乎在此上找不到任何内容。

接口:

public interface OnDataListener {
    public void onDataReceived(String data);
}

片段A数据侦听器:

OnDataListener mOnDataListener;

@Override
public void onAttach(Context context) {
    try{
        mOnDataListener = (OnDataListener) context;
        Log.d(TAG, "onAttach was called" + context);
    }catch (ClassCastException e){
        Log.e(TAG, "onAttach: ClassCastException: " + e.getMessage() );
    }
    super.onAttach(context);
}

片段A的onCreateView中的按钮逻辑:

button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

          String newTextString = editTextView.getText().toString();
          mOnDataListener.onDataReceived(newTextString);

        }
      });

MainActivity数据接收器

public class MainActivity extends AppCompatActivity implements OnDataListener {


@Override
public void onDataReceived(String data) {

    Log.e(TAG, "MainActivity received this string " + data );

            }
}

解决方案1

在您的MainActivity中

@Override
public void onDataReceived(String data) {
   Log.e(TAG, "MainActivity received this string " + data );
   Bundle bundle = new Bundle();
   bundle.putString("edttext", data);
   FragmentB fragment = new FragmentB();
   fragment.setArguments(bundle);
   // Fragment Transaction method goes here
}

在您的FragmentB中检索数据

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
   String strtext = getArguments().getString("edttext");    
   return inflater.inflate(R.layout.fragment, container, false);
}

解决方案2

您可以将回调数据放入全局变量,并在onClickListerner时在片段事务中使用它。

解决方案3

A)在您的FragmentB中创建方法

public void changeText (String data) {
   textview.setText(data)
 }

B)并从MainActivity传递值

@Override
public void onDataReceived (String data) {
    myInterface.CallBack("Callbacked when onCreate method Created" + data);
    Log.d("Tiggered", "respond: ");
    FragmentManager manager = getFragmentManager();
    FragmentB fragmentB = (FragmentB) manager.findFragmentById(R.id.id_fragmentB);
    fragmentB.changeText(data);
}

解决方案1:使用回调

// 如果片段实例处于活动状态,这将起作用,因此请检查viewpager屏幕外限制

(您也可以使用Farid Haq提到的解决方案3,该解决方案通过自己进行活动来完成)

在这里,Activity实现了回调OnDataUpdateListener

interface OnDataUpdateListener{
    void passDataToFragmentB(String data)
}

活动代码:

Fragment instanceFragmentB;
// intialise it somewhere in your activity
// or get from viewpager adapter

@Override
void passDataToFragmentB(String data){
    instanceFragmentB.onDataChange(data)
}

片段代码:

OnDataUpdateListener mOnDataUpdateListener;
onAttach(Activity activity){
    mOnDataUpdateListener=  (OnDataUpdateListener) activity
}

onViewCreated(){
    somebutton.onClick{
        mOnDataUpdateListener.passDataToFragmentB("someString")
    }
}

片段B代码:

onDataChange(String data){
    //do your work with update data passed from fragment A  
}

解决方案2:使用EventBus或RxBus

//如果片段实例处于活动状态,这将起作用,因此请检查viewpager屏幕外限制

使用事件或rxbus,在总线上发布新的更新值,并使目标片段观察相同的值类型。

片段A:

onViewCreated(){
    somebutton.onClick{
        EventBus.post("your data")
    }
}

片段B:

@Subsribe
void onDataChange(String data){
    //do your work with update data passed from fragment A  
}

解决方案3:使用ViewModel。

在所有片段中使用带有活动上下文的viewmodel,并在LiveData中使用Wrap String。

每当更改字符串数据时,只需将新数据发布到String Livedata对象上即可。 观察实时数据的所有片段将获得更新的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM