在不同的片段之间共享数据

时间:2017-09-10 08:20:53

标签: android android-fragments

我想在4个不同的片段之间共享一个String值。 如果我在一个片段中更改一个值,我想将此值发送给其他片段。

我该怎么做?

我唯一知道的是,在一个片段中我可以更改像

这样的TextView
String newValue = "New Text";
View v = inflater.inflate(R.layout.fragment_one, container, false);
Textview tv = (Textview) v.findViewById(R.id.textview_from_fragment_one);
tv.setText(newValue);

但是如何发送newValue e.G.片段fragment_two和fragment_three?

3 个答案:

答案 0 :(得分:2)

我建议您使用EventBus库,here是如何开始使用EventBus的教程。

此外,您可以使用带有this教程的RxJava实现此目的。

但如果您不想使用任何库,那么:

  1. 首先创建如下界面:

    public interface Data {
    
        void dataChanged(String changedString);
    
    }
    
  2. 在所有片段中实现此界面,如下所示:

    public class FirstFragment extends Fragment implements Data {
    
        ...
    
        @Override
        public void dataChanged(String changedString){
    
            // In this method you'll receive the changed string value
    
        }
    
    }
    
  3. 在您的活动中创建一个方法,如下所示:

    public void changeData(String changedData){
    
        // Notify your first fragment
        Data data = myFirstFragment;
        data.dataChanged(changedData);
    
        // Notify your second fragment
        data = mySecondFragment;
        data.dataChanged(changedData);
    
        // Other fragments
        ...
    
    }
    
  4. 每当您更改该字符串值时,请通知其他类似的片段:

    // Call this inside your fragment
    ((YourActivity)getActivity()).changeData(CHANGED_VALUE);
    

答案 1 :(得分:0)

您可以使用Bundle

String newValue = "New Text";

Bundle bundle = new Bundle(); 
// you can put as much fragments as you want

NewFragment fragment = new NewFragment(); 
SecondFragment fragment_two = new SecondFragment(); 
ThirdFragment fragment_three = new ThirdFragment(); 

bundle.putString("some_tag", newValue ); 
fragment.setArguments(bundle);
fragment_two.setArguments(bundle);
fragment_three.setArguments(bundle);

在您设置为具有此值的任何片段中添加以下内容:

if (bundle != null) 
{
    String newValue = getArguments().getString("some_tag");
}

答案 2 :(得分:0)

您可以使用Bundle,例如(在启动活动中添加额外的)片段:

  1. 在活动中调用Fragment:

    Fragment fragment = new ExampleFragment(); 
    
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    
    Bundle bundle = new Bundle();
    bundle.putString("key", "TEST");
    fragment.setArguments(bundle);
    
    transaction.replace(R.id.frame , fragment);
    transaction.commit();
    
  2. 在Fragment中将它放在onViewCreated():

     String exampleString;
     Bundle bundle = this.getArguments();
        if (bundle != null) {
         exampleString = bundle.getString("key", "");
    
        Toast.makeText(getActivity() , exampleString , Toast.LENGTH_SHORT).show();
    
  3. 注意:在活动中使用Interface for call methode替换片段。