在一个活动的两个片段之间共享数据

时间:2015-10-20 08:54:56

标签: android android-intent android-activity fragment

我有两个碎片。一个用于数据输入,一个用于在ListView中显示它们。 但我不知道如何将数据从Fragment 1发送到Fragment 2 ......

我知道我可以使用以下代码从MainActivity获取数据到片段1:

String listElement = getActivity().getIntent().getStringExtra("com.sample.MESSAGE");

但是如何将片段2中的字符串发送到我的Activity?

更新:我不太确定我是否正确行事......我使用了Harlo Holmes教程(如下所示)而不是我有这个片段代码

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;


    public class AddDataFragment extends Fragment {

        public interface OnDataPass {
            public void onDataPass(String data);
        }

        Button buttonadd;
        Button buttondelete;

        private EditText inputProduct;

        private TextView listElement;

        OnDataPass dataPasser;

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

            Activity a;

            if (context instanceof Activity){
                a=(Activity) context;
            }
            dataPasser = (OnDataPass) context;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,                                            Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.fragment_add_data, container, false);
            inputProduct = (EditText) view.findViewById(R.id.editText_product);
            buttonadd = (Button) view.findViewById(R.id.button_add_addData);
            buttondelete = (Button) view.findViewById(R.id.button_delete_addData);

            listElement = (TextView) view.findViewById(R.id.productTest);

            buttonadd.setEnabled(true);
            buttondelete.setEnabled(true);

            buttonadd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listElement.setText(getString(R.string.ListElementPlaceholder,                           inputProduct.getText()));
                }
                public void passData(String listElement){
                    dataPasser.onDataPass(listElement);
                }
            });

            return view;
        }


}

onAttach方法存在一些问题......这是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

interface与其托管Fragment进行通信时,Activity是最常见的方式。 Nandakishore Shetty在评论中的链接引用了Android Docs中推荐的方法,这是我使用的方法,非常稳定(下面编辑的例子)。

public class MyFragment extends Fragment {

    MyFragmentListener mCallback;

    // Container Activity must implement this interface
    public interface MyFragmentListener {
        public void methodToImplemet(int position);
    }

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

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

    ...
}

Fragment内某处,您可以拨打mCallback.methodToImplement(position);(即在onClick()内)

然后,在Activity

public class MainActivity extends Activity implements MyFragmentListener {
    //...
    @Override
    public void methodToImeplement(int position) {
        Log.e(getClass().getSimpleName(), "position: " + position);
    }

这是一个link to a sample app,显示我为了类似的SO问题而组建的片段/活动通信。

其他替代方法包括使用某种EventBus,例如LocalBroadcastManager或第三方库。

答案 1 :(得分:0)

可以使用interfaces将数据从片段传递到活动。

详细说明:

Passing data between a fragment and its container activity

希望它会对你有所帮助。