从调用片段对话框的“活动”中返回数据

时间:2018-07-25 02:19:46

标签: android android-studio

我有一个代码将片段称为活动。我从该片段中选择一个数据,然后将其返回给活动调用者,这是我的代码。

在这里我如何打开对话框

fragment_customer_list dialog = new fragment_customer_list();
                dialog.show(getFragmentManager(),"CustomerList");

这是我返回值的方式

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TextView position1 = (TextView) view.findViewById(R.id.list_name);
                TextView position2 = (TextView) view.findViewById(R.id.list_address);
                String customer_name = position1.getText().toString();
                String customer_address = position2.getText().toString();

                add callingActivity = (add_activity ) getActivity();
                callingActivity.onUserSelectValue(customer_name, customer_address);
                getDialog().dismiss();
            }
        });

我将从活动中调用一个函数,该函数调用对话框来更新编辑文本。

 public void onUserSelectValue(String selectedValue1 ,String selectedValue2) {
        //Toast.makeText(getBaseContext(), ""+ selectedValue1 + selectedValue2, Toast.LENGTH_LONG).show();
        EditText customer_name = (EditText) findViewById(R.id.cusname);
        customer_name.setText(selectedValue1);

        EditText customer_address = (EditText) findViewById(R.id.address);
        customer_address.setText(selectedValue2);
    }

问题是对话框固定在一个活动中。我的问题是如何从活动调用者返回数据?由于该片段将被许多活动使用

============================更新=============== =============

这是我打开片段并将其作为对话框打开的方式

 /* Open Customer List  */
    final EditText show_customer_list = (EditText) findViewById(R.id.cusname);
    show_customer_list.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fragment_customer_list dialog = new fragment_customer_list();
            dialog.setOnClickItemListener(new fragment_customer_list.OnClickItemListener()
            {
                @Override
                public void value(String name, String address)
                {
                    show_customer_list.setText(name + " " + address);
                }
            });
            dialog.show(getFragmentManager(),"CustomerList");
        }
    });

这是整个代码fragment_customer_list

public class fragment_customer_list extends DialogFragment {
    private static final String TAG = "CustomerList";
    DatabaseHelper myDb;
    String pattern_email;
    SimpleAdapter adapter;
    private DialogInterface.OnClickListener listener;
    private OnClickItemListener mListener;

    @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_customer_list, container, false);
        final ListView listView = (ListView) view.findViewById(R.id.customer_list);
        myDb = new DatabaseHelper(getActivity());
        pattern_email = credentials.email;

        final ArrayList<String> result = new ArrayList<>();
        Cursor data = myDb.get_customer(pattern_email);

        if (data.getCount() == 0) {
            Toast.makeText(getActivity(), "Please sync to check your customers", Toast.LENGTH_LONG).show();
        } else {
            List<Map<String, String>> data1 = new ArrayList<Map<String, String>>();
            while (data.moveToNext()) {
                Map<String, String> datum = new HashMap<String, String>(2);
                datum.put("Customer Name", data.getString(1));
                datum.put("Address", data.getString(2));
                data1.add(datum);
            }
            adapter = new SimpleAdapter(getActivity(), data1,
                    R.layout.customer_listview,
                    new String[]{"Customer Name", "Address"},
                    new int[]{R.id.list_name,
                            R.id.list_address});
            listView.setAdapter(adapter);
        }

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TextView position1 = (TextView) view.findViewById(R.id.list_name);
                TextView position2 = (TextView) view.findViewById(R.id.list_address);
                String customer_name = position1.getText().toString();
                String customer_address = position2.getText().toString();

//                add_activity callingActivity = (add_activity ) getActivity();
//                callingActivity.onUserSelectValue(customer_name, customer_address);
                if (mListener != null) {
                    mListener.value(customer_name, customer_address);
                }

                getDialog().dismiss();

            }
        });

        android.widget.Button clickButton = (android.widget.Button) view.findViewById(R.id.close);
        clickButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                getDialog().dismiss();
            }
        });

        /* Search customer */
        EditText customer_search = (EditText) view.findViewById(R.id.search_customer);
        customer_search.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                final ArrayList<String> result = new ArrayList<>();
                Cursor data = myDb.get_customer_search(cs.toString(),pattern_email);

                if (data.getCount() == 0) {
                    //Toast.makeText(getActivity(), "Please sync to check your customers", Toast.LENGTH_LONG).show();
                } else {
                    List<Map<String, String>> data1 = new ArrayList<Map<String, String>>();
                    while (data.moveToNext()) {
                        Map<String, String> datum = new HashMap<String, String>(2);
                        datum.put("Customer Name", data.getString(1));
                        datum.put("Address", data.getString(2));
                        data1.add(datum);
                    }
                    adapter = new SimpleAdapter(getActivity(), data1,
                            R.layout.customer_listview,
                            new String[]{"Customer Name", "Address"},
                            new int[]{R.id.list_name,
                                    R.id.list_address});
                    listView.setAdapter(adapter);
                    adapter.notifyDataSetChanged();
                }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }

            @Override
            public void afterTextChanged(Editable arg0) {

            }
        });

        return view;
    }


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new Dialog(getActivity(), R.style.WideDialog);
    }


    public void setOnClickItemListener(OnClickItemListener l) {
        mListener = l;
    }

    interface OnClickItemListener {
        void value(String name, String address);
    }
}

您可以在上面的代码中看到,Listview的代码与此相同。

add_activity callingActivity = (add_activity ) getActivity();
                callingActivity.onUserSelectValue(customer_name, customer_address);
                getDialog().dismiss();

上面的代码将从列表视图中获取值,并从onUserSelectValue调用add_activity,然后关闭对话框

这是onUserSelectValue,它位于add_activity

public void onUserSelectValue(String selectedValue1 ,String selectedValue2) {
        //Toast.makeText(getBaseContext(), ""+ selectedValue1 + selectedValue2, Toast.LENGTH_LONG).show();
        EditText customer_name = (EditText) findViewById(R.id.cusname);
        customer_name.setText(selectedValue1);

        EditText customer_address = (EditText) findViewById(R.id.address);
        customer_address.setText(selectedValue2);
    }

这是我的问题。 如何将列表视图的值返回到打开片段的活动的文本字段(列表视图所在的位置)。

更新代码

我创建了一个名为DialogHelper.java的类,这是代码

public class DialogHelper {
    private static WeakReference<fragment_customer_list> wr;

    public static void userSelectValue(Activity context, fragment_customer_list.OnClickItemListener listener) {
        if (wr == null || wr.get() == null) {
            fragment_customer_list dialog = new fragment_customer_list();
            wr = new WeakReference<>(dialog);
        }
        fragment_customer_list dialog = wr.get();
        dialog.OnClickItemListener(listener);
        dialog.show(context.getFragmentManager(),"CustomerList");
    }

    // dialog dismiss
    public static void dismiss() {
        if (wr == null || wr.get() == null) return;
        wr.get().dismiss();
    }
}

在我的customer_fragment_list.java中,我有一个列表视图侦听器

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TextView position1 = (TextView) view.findViewById(R.id.list_name);
                TextView position2 = (TextView) view.findViewById(R.id.list_address);
                TextView position3 = (TextView) view.findViewById(R.id.list_code);
                String customer_name = position1.getText().toString();
                String customer_address = position2.getText().toString();
                String customer_code = position3.getText().toString();

                if (listener != null) {
                    listener.click(customer_name, customer_address,customer_code );
                }
            }
        });

与此一起

public void setOnClickListener(OnClickListener l) {
        this.listener = l;
    }


    interface OnClickListener {
        void click(String name, String address,String KUNNR);
    }

    public interface OnClickItemListener { void value(String name, String address, String code); }

在“我的活动”中,这是我如何打开对话框的代码

/* Open Customer List  */
        DialogHelper.userSelectValue(add_covplan.this, new fragment_customer_list.OnClickItemListener()
        {
            @Override
            public void value(String name, String address)
            {
                EditText customer_name = (EditText) findViewById(R.id.cusname);
                customer_name.setText(name);

                EditText customer_address = (EditText) findViewById(R.id.address);
                customer_address.setText(address);
            }
        });

2 个答案:

答案 0 :(得分:0)

您可以执行此操作。不知道你是不是这个意思?

public class DialogHelper {
    private static WeakReference<fragment_customer_list> wr;
    private static WeakReference<Activity> wrActivity;

    public static void userSelectValue(Activity context, fragment_customer_list.OnClickItemListener listener) {
        if (wr == null || wr.get() == null || wrActivity == null || wrActivity.get() == null || wrActivity.get() != context) {
            fragment_customer_list dialog = new fragment_customer_list();
            wr = new WeakReference<>(dialog);
            wrActivity = new WeakReference<>(context);
        }
        fragment_customer_list dialog = wr.get();
        dialog.setOnClickItemListener(listener);
        dialog.show(context.getFragmentManager(),"CustomerList");
    }

    // dialog dismiss
    public static void dismiss() {
        if (wr == null || wr.get() == null || !wr.get().isShowing()) return;
        wr.get().dismiss();
    }
}

使用

    final EditText show_customer_list = (EditText) findViewById(R.id.cusname);
    DialogHelper.userSelectValue(this, new fragment_customer_list.OnClickItemListener()
    {
        @Override
        public void value(String name, String address)
        {
            show_customer_list.setText(name + " " + address);
        }
    });

修改答案

// Suppose this is a FragmentDialog
public class FragmentList {
    private OnClickListener listener;
    private ListView listView;

    // Suppose this has your list listener
    public void onResume() {
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TextView position1 = (TextView) view.findViewById(R.id.list_name);
                TextView position2 = (TextView) view.findViewById(R.id.list_address);
                String customer_name = position1.getText().toString();
                String customer_address = position2.getText().toString();

                if (listener != null) {
                    listener.click(customer_name, customer_address);
                }
            }
        });

    }

    public void setOnClickListener(OnClickListener l) {
        this.listener = l;
    }

    interface OnClickListener {
        void click(String name, String address);
    }
}

// Suppose this is a Activity
class YourActivity extends Activity
{
    private FragmentList fragmentList;
    EditText customer_address;
    EditText customer_name;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        fragmentList = new FragmentList();
        customer_address = (EditText) findViewById(R.id.address);
        customer_name = (EditText) findViewById(R.id.cusname);
        fragmentList.setOnClickListener(new FragmentList.OnClickListener()
        {
            @Override
            public void click(String name, String address)
            {
                // ...

                customer_name.setText(name);
                customer_address.setText(address);
            }
        });
    }

}

答案 1 :(得分:0)

您可以使用ViewModel类实现在ActivityFragment之间共享资源。在ViewModel的多个用法中共享单个上下文,每个用法共享一个相同的ViewModel。它适用于观察者和可观察的模式,非常适合此用例。您可以查看有关如何实现它的详细信息here