Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java private int在设置后不保留其值_Java_Android_Android Dialogfragment - Fatal编程技术网

Java private int在设置后不保留其值

Java private int在设置后不保留其值,java,android,android-dialogfragment,Java,Android,Android 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

我有一个
对话框片段
,其中在构造函数中声明了一个整数:

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);
    }
}
总之,日志是这样的:

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

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

// onCreateDialog:
onCreateDialog: 0
我做错了什么?请帮忙

编辑:

完整的exmaple:

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

您的代码在创建
DatePickerDialog
之前正在执行“onCreateDialog”日志记录。因此,您的日志记录必须按以下顺序进行:

// onCreateDialog:
onCreateDialog: 0

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

您的程序需要相同的实例变量,在这种情况下,您可以使用Singleton类或对您的程序进行调整使用始终相同的实例。

您应该使用bundle args而不是试图设置变量-使用args可以避免许多状态问题(重新创建的片段等)

要显示该对话框时:

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

请发一封信。确认您始终在同一
MyDialogFragment
object.Ok上操作。请参阅编辑。“private int在设置后不保留其值”-根本不可能:(猜测:您无意中对一个对象进行了“设置”…但他们在完全不同的对象上调用了“onCreateDialog()”。建议:1)在调试语句中打印“this”对象引用,2)尝试在井中重现问题,技术上是的。但是如果我再次创建对话框,设置为非零值的整数将记录为零。我将进行编辑以澄清。
day
是一个局部变量。每次启动
DatePickerDialogFragment
,您都会得到一个新的局部
myInt
变量,初始化为0。我以为实例保留在内存中,只有
onCreateDialog
被重复调用?返回什么?你可以试着打电话来达到这个效果。你能举个例子说明如何做到这一点吗?
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");