在同一个Activity中的Fragments之间传递数据

时间:2016-07-12 14:32:16

标签: android android-fragments

我正在一个项目中工作,该项目包含许多片段的活动。现在我需要在这些片段之间共享一些数据(整数,字符串,arraylist)。

我第一次使用静态字段,但我认为这是一种糟糕的方式 然后我找到了this solution

但在我的情况下,没有按钮可以点击我只需要在片段之间导航 有什么简单的方法可以在片段之间共享数据

7 个答案:

答案 0 :(得分:6)

我认为最适合您的解决方案是将变量放在主要活动中并从片段中访问它们。我的意思是,如果你必须在所有片段中做同样的事情,你可以在活动中编写代码,然后调用你需要的方法。

您需要为此目的使用界面

public interface DataCommunication {
    public String getMyVariableX();
    public void setMyVariableX(String x);
    public int getMyVariableY();
    public void setMyVariableY(int y);
}

然后,在您的活动中实施

public class MainActivity extends Activity implements DataCommunication {

    private String x;
    private int y;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...   
    }

    ...

    @Override
    public String getMyVariableX(){
        return x;
    }

    @Override
    public void setMyVariableX(String x){
        //do whatever or just set
        this.x = x;
    }

    @Override
    public int getMyVariableY(){
        return y;
    }

    @Override
    public void setMyVariableY(int y){
        //do whatever or just set
        this.y = y;
    }

    ...

然后,在所有片段中附加活动:

public class Fragment_1 extends Fragment{

    DataCommunication mCallback;

 @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (DataCommunication) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + " must implement DataCommunication");
        }
    }

    ...

最后,当你需要在片段中使用变量时,只需使用你创建的get和se方法

  

https://developer.android.com/training/basics/fragments/communicating.html

答案 1 :(得分:4)

最简单的方法是使用Bundle。你做这样的事情:

片段A:

Bundle b = new Bundle();
b.putString("Key", "YourValue");
b.putInt("YourKey", 1);

FragmentB fragB = new FragmentB();
fragB.setArguments(b); 
getFragmentManager().beginTransaction().replace(R.id.your_container, fragB);

片段B:

Bundle b = this.getArguments();
if(b != null){
   int i = b.getInt("YourKey");
   String s =b.getString("Key");
}

这是我发现将数据从一个片段发送到另一个片段的最简单方法。希望它可以帮助某人。

答案 2 :(得分:2)

你有一些选择:

选项1:如果需要在片段之间共享信息,可以使用SharedPreferences存储信息。这是一个例子:

SharedPreferences settings = context.getSharedPreferences("Preferences", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("string1", var);
    editor.putBoolean("bool1", var);
    ...
    editor.commit();

选项2:如果已实例化片段,则可以创建set方法以在片段中存储某种信息。例如,如果要传递字符串数组,可以在片段中创建数组变量(使用setter方法)。稍后,当您实例化此片段时,可以使用setter方法将此数组传递给片段。

答案 3 :(得分:1)

您可以创建一个Application类(我的意思是扩展Application),然后根据需要获取一些变量,制作getter和setter方法。将值设置为变量并在需要的时间和地点获取值。如果你愿意我可以给你一些演示代码。

答案 4 :(得分:0)

我们可以通过两种方式在片段之间共享数据。

  1. 使用捆绑包

  2. 通过使用持久性存储

通过使用捆绑包:-

Bundle bundle=new Bundle();
bundle.putString("firstName",Fist);
bundle.putString("LastName",lastN);

第二个持久性存储:- 您可以检查如何在持久性存储中存储数据。 希望它对您有用

答案 5 :(得分:0)

使用在官方ViewModel documentation上建议的SharedViewModel

首先实现fragment-ktx,以便更轻松地实例化视图模型

dependencies {
implementation "androidx.fragment:fragment-ktx:1.2.2"
}

然后,您只需要将要与另一个片段共享的数据放入视图模型中

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

然后,最后,只需在每个片段中实例化viewModel,然后设置要设置数据的片段中的selected值

片段A

class MasterFragment : Fragment() {

    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
        model.select(item)
      }

    }
}

然后,只需在Fragment目的地监听此值

片段B

class DetailFragment : Fragment() {

        private val model: SharedViewModel by activityViewModels()

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
                // Update the UI
            })
        }
    }

此答案可以帮助您https://stackoverflow.com/a/60696777/6761436

答案 6 :(得分:-1)

1.使用BroadCastReceiver(有点复杂)

2.使用SharePreference

3.将数据保存到MyApplication中扩展了应用程序