【问题标题】:weird behaviour of AlertDialogAlertDialog 的奇怪行为
【发布时间】:2017-08-03 15:28:14
【问题描述】:

我有一个编辑文本,如果我输入一些文本并单击后退按钮,它会显示一个对话框,询问我是否放弃更改,但我想在创建活动时显示键盘,所以我在我的片段的oncreateview

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

现在当我在编辑文本中进行更改时,AlertDialog 不会显示您是否要放弃更改?

如果我删除该行

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

从我的 onCreateView 中显示 AlertDialog。

    public class EditorFragment extends Fragment implements android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>, EditorActivity.OnBackPressedListener {


    private EditText TaskName, DueDate, DueTime;
private boolean taskChanged = false;
 private View.OnTouchListener onTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            taskChanged = true;
            return false;
        }
    };

 @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_editor, container, false);
       TaskName = (EditText) view.findViewById(R.id.tasknameedittext);
        DueDate = (EditText) view.findViewById(R.id.duedateedittext);
        DueTime = (EditText) view.findViewById(R.id.duetimeedittext);

   TaskName.setOnTouchListener(onTouchListener);
        DueDate.setOnTouchListener(onTouchListener);
        DueTime.setOnTouchListener(onTouchListener);
 getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        getActivity().getMenuInflater().inflate(R.menu.menu_editor, menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.editoractivitydelete:
                showDeleteConfirmationDialog();
                return true;
            case R.id.editoractivitysave:
                saveTask();

                return true;
            case android.R.id.home:
                //up button code
                if (!taskChanged) {
                    NavUtils.navigateUpFromSameTask(getActivity());
                    return true;
                }
                DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        NavUtils.navigateUpFromSameTask(getActivity());
                    }
                };

                showUnsavedChangesDialog(onClickListener);
                return true;


        }
        return super.onOptionsItemSelected(item);
    }


 private void showUnsavedChangesDialog(DialogInterface.OnClickListener onClickListener) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.discardchanges);
        builder.setPositiveButton(R.string.yes, onClickListener);
        builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (dialog != null) {
                    dialog.dismiss();
                }
            }
        });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

 @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ((EditorActivity) getActivity()).setOnBackPressedListener(this);
    }

    //Back Button code
    @Override
    public void doBack() {
        if (!taskChanged) {
            NavUtils.navigateUpFromSameTask(getActivity());
            return;
        }

        DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                NavUtils.navigateUpFromSameTask(getActivity());
            }
        };

        showUnsavedChangesDialog(onClickListener);
    }
}

【问题讨论】:

    标签: android android-alertdialog android-keypad


    【解决方案1】:

    我无法从您的问题中看出您是如何检测到状态变化的。

    你试试这个策略怎么样。

    1. 将onCreate中editText内容的状态保存到某个成员变量中。
    2. 按下后退按钮时,检查editText 的当前内容是否与您在onCreate 中保存的成员变量相同。
    3. 如果它们不同,则使用该条件调用您的方法以显示 alertDialog。否则让用户退出。

    使用上述代码的示例

    public class EditorFragment extends Fragment implements android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>, EditorActivity.OnBackPressedListener {
    
    
        private EditText TaskName, DueDate, DueTime;
        private String originalTask = "";
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_editor, container, false);
           TaskName = (EditText) view.findViewById(R.id.tasknameedittext);
            DueDate = (EditText) view.findViewById(R.id.duedateedittext);
            DueTime = (EditText) view.findViewById(R.id.duetimeedittext);
           originalTask = TaskName.getText().toString();
    
        TaskName.setOnTouchListener(onTouchListener);
            DueDate.setOnTouchListener(onTouchListener);
            DueTime.setOnTouchListener(onTouchListener);
     getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    }
     @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            super.onCreateOptionsMenu(menu, inflater);
            getActivity().getMenuInflater().inflate(R.menu.menu_editor, menu);
        }
    
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.editoractivitydelete:
                    showDeleteConfirmationDialog();
                    return true;
                case R.id.editoractivitysave:
                    saveTask();
    
                    return true;
                case android.R.id.home:
                    //up button code
                    if (!taskChanged) {
                        NavUtils.navigateUpFromSameTask(getActivity());
                        return true;
                    }
                    DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            NavUtils.navigateUpFromSameTask(getActivity());
                        }
                    };
    
                    showUnsavedChangesDialog(onClickListener);
                    return true;
    
    
            }
            return super.onOptionsItemSelected(item);
        }
    
    
     private void showUnsavedChangesDialog(DialogInterface.OnClickListener onClickListener) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage(R.string.discardchanges);
            builder.setPositiveButton(R.string.yes, onClickListener);
            builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (dialog != null) {
                        dialog.dismiss();
                    }
                }
            });
    
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
        }
    
     @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            ((EditorActivity) getActivity()).setOnBackPressedListener(this);
        }
    
        //Back Button code
        @Override
        public void doBack() {
            if (!originalTask.equals(TaskName.getText().toString()))
            {
               NavUtils.navigateUpFromSameTask(getActivity());
               return;
            }
    
            DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    NavUtils.navigateUpFromSameTask(getActivity());
                }
            };
    
            showUnsavedChangesDialog(onClickListener);
        }
    }
    

    【讨论】:

    • 我也做了同样的事情,使用一个布尔变量来检查用户是否改变了edittext的状态。下面是代码
    • 能否请您发布您的代码。我没有足够的业力来评论你最初的帖子要问。然后我可以进一步协助
    • 当 OnTouchListener 触发时,您可以尝试以下操作,而不是使用布尔 taskChanged 然后设置 true。而不是你的布尔taskChanged。保留一个 String 成员变量,该变量设置为您的 editText onCreateView 的初始值。按下后退时。检查字符串是否等于当前在editText中的文本我将使用示例编辑上面的代码
    • 不工作。我认为罪魁祸首是 getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);你知道在活动启动时显示键盘的任何其他方式吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2015-07-20
    • 2010-10-03
    相关资源
    最近更新 更多