【问题标题】:android: how do I fix onBackPress listener?android:如何修复 onBackPress 监听器?
【发布时间】:2017-12-08 12:35:54
【问题描述】:

我有一个带有一堆 EditText 行的 UI,供用户输入数据,c/f/gListenerEditTexts。当用户在 fListenerEditText 行上输入数据并按下 Back 键时,DiscardFragment 对话框正确打开。如果用户单击对话框上的“确定”按钮,则对话框关闭,数据被丢弃,用户返回上一个 Activity。我的问题是当用户按下 Back 键时 gListenerEditText 行没有按预期工作。在这种情况下,DiscardFragment 对话框会打开 1 或 2 秒,然后自动关闭,UI 会返回到上一个 Activity。这发生在用户没有单击“确定”按钮的情况下。我在这里错过了什么?

EditActivity.java

public class EditActivity extends AppCompatActivity 

private ListenerEditText cListenerEditText,fListenerEditText,GListenerEditText;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(layout.activity_edit);

    cListenerEditText = (ListenerEditText) findViewById(id.CEditText);        
    fListenerEditText = (ListenerEditText) findViewById(id.FEditText);
    gListenerEditText = (ListenerEditText) findViewById(id.GEditText);

... 
cListenerEditText.setKeyImeChangeListener(new ListenerEditText.KeyImeChange() {
        @Override
        public boolean onKeyIme(int keyCode, KeyEvent event) {

            int stringToDo = cListenerEditText.getText().toString().replace(" ","").length();
            int stringDueDate = fListenerEditText.getText().toString().replace(" ","").length();
            int stringDueTime = gListenerEditText.getText().toString().replace(" ","").length();
            // If the EditText input line has data ("stringToDo") and the user presses the Back button,
            // then launch the DialogFragment to see if they really want to delete the data and
            // go back to the previous activity.
            if (stringToDo > 0) {
                FragmentManager fm3 = getSupportFragmentManager();
                DiscardFragment editNameDialog3 = new DiscardFragment();
                editNameDialog3.show(fm3,"s_dialog");
            }
            // when a date is entered by the user, this test works as expected
            else if (stringToDo == 0 && stringDueDate > 0) {
                FragmentManager fm4 = getSupportFragmentManager();
                DiscardFragment editNameDialog4 = new DiscardFragment();
                editNameDialog4.show(fm4,"s_dialog");
            }
            // when a time is entered by the user, this test is not working as expected
            else if (stringToDo == 0 && stringDueTime > 0) {
                FragmentManager fm5 = getSupportFragmentManager();
                DiscardFragment editNameDialog5 = new DiscardFragment();
                editNameDialog5.show(fm5,"s_dialog");
            }                
            else if (stringToDo == 0){
                // close the softkeyboard
                InputMethodManager imm = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(dListenerEditText.getWindowToken(),0);
            }
            return true;
        }
    });    


DiscardFragment.java

public class DiscardFragment extends DialogFragment{

    public DiscardSkycardFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.discardfrag_layout,container,false);
        getDialog().setTitle("Discard");


        // When the user clicks "Cancel" in the "Delete" dialog, return to the CardViewActivity.
        Button btnCancel = (Button) rootView.findViewById(R.id.btnCancel);
        btnCancel.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(EditActivity.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);                
            getDialog().cancel();
        }
        });

        // When the user clicks "OK" to delete for the "Delete" dialog.
        Button btnOK = (Button) rootView.findViewById(R.id.btnOK);
        btnOK.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            dismiss();
            // Next line returns to the previous activity (MainActivity) by closing
            // the current activity (CardViewActivity).
            getActivity().finish();
        }
        });

        // handles when the user presses the Back Button when the "Delete" dialog is open.
        getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
        @Override
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if ((keyCode == KeyEvent.KEYCODE_BACK)) {
                // This filters the event as the back button press
                if (event.getAction()!= KeyEvent.ACTION_DOWN)
                    // Next line dismisses the dialogfragment
                    dismiss();
                // Next line returns to the previous activity (MainActivity) by closing the fragment and
                // the current activity (CardViewActivity).
                getActivity().finish();
                return true;
            }
            return false;
        }
        });
        return rootView;
    }

}

【问题讨论】:

    标签: android string android-edittext


    【解决方案1】:

    试试这个。

    cListenerEditText.setKeyImeChangeListener(new ListenerEditText.KeyImeChange() {
            @Override
            public boolean onKeyIme(int keyCode, KeyEvent event) {
              if(event.getAction()==KeyEvent.ACTION_UP) {
                int stringToDo = cListenerEditText.getText().toString().replace(" ","").length();
                int stringDueDate = fListenerEditText.getText().toString().replace(" ","").length();
                int stringDueTime = gListenerEditText.getText().toString().replace(" ","").length();
                // If the EditText input line has data ("stringToDo") and the user presses the Back button,
                // then launch the DialogFragment to see if they really want to delete the data and
                // go back to the previous activity.
                if (stringToDo > 0) {
                    FragmentManager fm3 = getSupportFragmentManager();
                    DiscardFragment editNameDialog3 = new DiscardFragment();
                    editNameDialog3.show(fm3,"s_dialog");
                }
                // when a date is entered by the user, this test works as expected
                else if (stringToDo == 0 && stringDueDate > 0) {
                    FragmentManager fm4 = getSupportFragmentManager();
                    DiscardFragment editNameDialog4 = new DiscardFragment();
                    editNameDialog4.show(fm4,"s_dialog");
                }
                // when a time is entered by the user, this test is not working as expected
                else if (stringToDo == 0 && stringDueTime > 0) {
                    FragmentManager fm5 = getSupportFragmentManager();
                    DiscardFragment editNameDialog5 = new DiscardFragment();
                    editNameDialog5.show(fm5,"s_dialog");
                }                
                else if (stringToDo == 0){
                    // close the softkeyboard
                    InputMethodManager imm = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(dListenerEditText.getWindowToken(),0);
                }
              }
              return true;
            }
        });   
    

    【讨论】:

    • 好的。除了“if(keyCode == ...”行之外,您是否添加或更改了其他任何内容?
    • 好的,我试试看。
    • if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN) 或 if(event.getAction()==KeyEvent.ACTION_DOWN)
    • 不走运。该对话框不会为用户打开。 Activity 只是关闭并将用户返回到上一个 Activity。
    • 用户按下返回键有两个事件。 ACTION_DOWN 和 ACTION_UP。
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多