从对话框发送数据到片段

时间:2018-08-12 16:44:10

标签: android dialog fragment

我正在尝试将DialogFragment中的某些数据从TextView发送到Fragment

将数据插入可用输入中并按SAVE后,应用程序崩溃。

我认为IncomeDialogListener有问题。 我会感谢我做错了什么提示。

这是对话框类

    public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.layout_incomedialog, null);

    builder.setView(view)
            .setTitle("Add Income")
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .setPositiveButton("Save", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                        String Amount = enter_income_amount.getText().toString();
                        String Note = enter_income_note.getText().toString();
                        String Date = enter_income_date.getText().toString();
                        incomeDialogListener.addDetails(Amount, Note, Date);



                }
            });

    enter_income_amount = view.findViewById(R.id.enter_income_amount);
    enter_income_note = view.findViewById(R.id.enter_income_note);
    enter_income_date = view.findViewById(R.id.enter_income_date);


    return builder.create();
}

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

    try {
        incomeDialogListener = (IncomeDialogListener) getTargetFragment();
    } catch (ClassCastException e) {

       throw new ClassCastException(context.toString() + "Must Implement IncomeDialogListener");
    }
}

public interface IncomeDialogListener {

    void addDetails(String Amount, String Note, String Date);

}

这是我要将数据发送到的片段

    public class IncomeFragment extends Fragment implements 
    IncomeDialog.IncomeDialogListener {

DatabaseHelper myDB;
Button btn_add_income;
TextView display_income;

public IncomeFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_placeholder2 , container, false);

    display_income = (TextView) v.findViewById(R.id.display_income);
    btn_add_income = (Button) v.findViewById(R.id.btn_add_income);
    myDB = new DatabaseHelper(getActivity());

    btn_add_income.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           openIncomeDialog();
        }
    });

    return v;
}

private void openIncomeDialog() {

    android.support.v4.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    IncomeDialog incomeDialog = new IncomeDialog();
    incomeDialog.show(fragmentTransaction, "income dialog"    );

}

@Override
public void addDetails(String Amount, String Note, String Date) {
    display_income.setText(Amount);
}
}

1 个答案:

答案 0 :(得分:0)

这是我为您提供的解决方案:

IncomeFragment.java

public static final int INCOME_DIALOG_FRAGMENT = 1; // Add this line

private void openIncomeDialog() {
    android.support.v4.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    IncomeDialog incomeDialog = new IncomeDialog();
    incomeDialog.setTargetFragment(IncomeFragment.this, INCOME_DIALOG_FRAGMENT); // Add this line
    incomeDialog.show(fragmentTransaction, "income dialog");
}

IncomeDialog.java

@Override
public void onClick(DialogInterface dialog, int which) {
    String Amount = enter_income_amount.getText().toString();
    String Note = enter_income_note.getText().toString();
    String Date = enter_income_date.getText().toString();
    IncomeDialogListener listener = (IncomeDialogListener) getTargetFragment();
    listener.addDetails(Amount, Note, Date);
}

更新:当您打开片段中的对话框时,您通过调用setTargetFragment将自己传递给了对话框,这没有什么魔术可言。然后,在对话框中,您可以通过调用getTargetFragment来引用打开它的片段。实际上,您可以使用两种解决方案。

IncomeFragment incomeFragment = (IncomeFragment) getTargetFragment();
incomeFragment.addDetails(Amount, Note, Date);

IncomeDialogListener listerner = (IncomeDialogListener) getTargetFragment();
listerner.addDetails(Amount, Note, Date);

我更喜欢使用第二个,因为对话框不需要了解打开它的特定片段。这使对话框可用。想象一下,三天后,您想从另一个片段打开对话框,在这种情况下,您无需再次修改对话框,只需让另一个片段实现IncomeDialogListener。如果您使用第一个片段,则必须转到对话框并对其进行修改,以确保它适用于另一个片段。