android - DialogFragment 使用接口(interface)回调到 Target Fragment

标签 android android-fragments interface callback android-dialogfragment

我正在尝试将一些数据从 dialogfragment 发送到目标 fragment 但它不起作用。

我写了下面的代码,但是它通过了exception:

java.lang.NullPointerException: Attempt to invoke interface method 'void com.x.x.FragmentAlertDialog$Communicator.setI(java.lang.String)' on a null object reference

代码:

public class FragmentAlertDialog extends DialogFragment {

Communicator callback;

public interface Communicator {
    void setI(String name);
}

public static FragmentAlertDialog newInstance(String id, int title, int items) {
    FragmentAlertDialog frag = new FragmentAlertDialog();
    Bundle args = new Bundle();
    args.putString("id", id);
    args.putInt("title", title);
    args.putInt("items", items);
    frag.setArguments(args);
    return frag;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    callback = (Communicator) getTargetFragment();
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    String id = getArguments().getString("id");
    int title = getArguments().getInt("title");
    String[] items = getResources().getStringArray(getArguments().getInt("items"));
    switch (id) {
        case MainActivity.DIALOG_1:
            return new AlertDialog.Builder(getActivity())
                    .setTitle(title)
                    .setItems(items, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            callback.setI("Important Data");
                        }
                    }).create();
    }
    return null;
}

fragment 类

public class FragmentXYXY extends Fragment implements View.OnClickListener, FragmentAlertDialog.Communicator {

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.et_i:
            DialogFragment newFragment = FragmentAlertDialog.newInstance(MainActivity.DIALOG_I, R.string.i_select, R.array.i_array);
            newFragment.setTargetFragment(this, 0);
            newFragment.show(getFragmentManager(), "dialog");
    }
}

@Override
public void setI(String name) {
    textI.setText(name);
}

谁能帮忙。 谢谢

修改代码- newFragment.setTargetFragment(this, 0);

最佳答案

你必须调用setTargetFragment

setTargetFragment(this, 0);

为了在您的 DialogFragment 中获取引用 FragmentXYXY

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.et_i:
            DialogFragment newFragment = FragmentAlertDialog.newInstance(MainActivity.DIALOG_I, R.string.i_select, R.array.i_array);
            newFragment.setTargetFragment(this, 0);
            newFragment.show(getFragmentManager(), "dialog");
    }
}

关于android - DialogFragment 使用接口(interface)回调到 Target Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931674/

相关文章:

android - 从 JUnit 单元测试设置 android.location.Location 对象的参数

android - 在 fragment 上输入 EditText 并填充所有其他 fragment

android - 如何处理2个FragmentTransaction

java - 无界Java通用接口(interface)的问题

interface - 使用接口(interface)时的 SIGSEGV

android - 在 fragmentHolder 中切换 fragment 后 ListView 清空

PHP 和 MySQL 到 Android 的翻译

javascript - 安卓-Javascript : how to execute jquery in webview

android - 更新抽屉导航 ListView

java - 为什么我可以覆盖静态接口(interface)方法?