java - private int 在设置后不保留其值

标签 java android android-dialogfragment

我有一个 DialogFragment,其中在构造函数中声明了一个整数:

public class MyDialogFragment extends DialogFragment {
    private int myInt;
}

我在这里设置整数:

private void setInt(int i) {
    myInt = i;
    Log.d("setting int", Integer.toString(myInt)); // logs proper value
}

setDate() 在监听器上调用:

private Dialog.OnSetListener l = new <>.OnSetListener() {
    @Override
    public void onSet(int arg1) { //arg1 is coming from the dialog
        setInt(arg1);
    }
}

现在,当使用整数创建对话框时,它会保留实例化值 (0) 而不是 setInt 中设置的值:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Log.d("onCreateDialog", Integer.toString(myInt); // Always 0
}

总而言之,日志是这样的:

// first dialog creation (for @cybersam)
onCreateDialog: 0

// After picking 9 in the dialog
setting int: 9

// onCreateDialog:
onCreateDialog: 0

我做错了什么?请帮忙。

编辑:

完整的例子:

public class DatePickerDialogFragment extends DialogFragment {
    private int myInt;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        Log.d("onCreateDialog", Integer.toString(myInt));

        return new DatePickerDialog(getActivity(), listener, 2012, 12, myInt);
    }

    private DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {

            // arg1 = year
            // arg2 = month
            // arg3 = day

            setDate(arg1, arg2, arg3);
        }
    };

    private void setDate (int y, int m, int d) {
        myInt = d;

        Log.d("setInt", Integer.toString(myInt));
    }
}

最佳答案

您应该使用 bundle args 而不是尝试设置变量 - 使用 args 可以避免很多状态问题(重新创建 fragment 等)。

private static final String INT_ARG = "int_arg";

public static MyDialogFragment newInstance(int arg)
{
    Bundle args = new Bundle();
    args.putInt(INT_ARG, arg);

    MyDialogFragment fragment = new MyDialogFragment();
    fragment.setArguments(args);

    return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    Bundle args = getArguments();

    if (args != null)
    {
        myInt = args.getInt(INT_ARG);
    }
}

当你想显示对话框时:

MyDialogFragment myFrag = MyDialogFragment.newInstance(mInt);
myFrag.show(getSupportFragmentManager(), "dialog");

关于java - private int 在设置后不保留其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687376/

相关文章:

java - 如何有效(不)测试服务层

Android 渲染脚本

java - NFC Mifare Ultralight 标签写入

java - Android - DialogFragment 未显示

android - TimePickerFragment 不工作

java - maven > 混合 scala/Java 项目 > scala : error: value toScan is not a member of object org. apache.hadoop.hbase.protobuf.ProtobufUtil

Java,未知字符 ン □ Xml 响应

java - Jframe 与 XML GUI

android - 图像渲染后 MediaPlayer 无法渲染到 TextureView

android - 如何使 dialogFragment 宽度与父级匹配?