【问题标题】:Sending data from Dialog to Fragment将数据从 Dialog 发送到 Fragment
【发布时间】:2018-08-12 16:44:09
【问题描述】:

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

在可用输入中插入数据并按 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);

}

这是我要向其发送数据的 Fragment

    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);
}
}

【问题讨论】:

  • 请包括错误信息/行号/和崩溃的堆栈跟踪,以便这个问题更容易回答。
  • "incomeDialogListener.addDetails(Amount, Note, Date);" - 请说明您如何分配value to incomeDialogListener

标签: android dialog fragment


【解决方案1】:

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

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 来引用打开它的片段。实际上,您可以使用 2 种解决方案。

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

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

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

【讨论】:

  • IncomeFragment incomeFragment = (IncomeDialogListener) getTargetFragment();需要incomeFragment,找到incomeDialog.incomeDialogListener 试图改成incomeDialogListernerincomedialoglistener = (IncomeDialogListener) getTargetFragment();现在它可以工作了:)
  • 非常感谢,但你能告诉我为什么吗?背后的逻辑是什么?
  • 是不是因为onClick参数“int which”的原因?
  • 感谢您的回答。我真的很感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多