android:如何覆盖后退按钮?

时间:2017-07-09 20:38:55

标签: android android-edittext fragment

我在UI上有许多EditText行,用户输入一些数据。用户在fListenerEditText行上输入Date(来自DatePicker片段)。然后将焦点返回到第一个EditText行,即cListenerEditText。对于默认的“后退”按钮行为,如果用户按下“返回”按钮,则“活动”将关闭,“日期”数据将立即丢失,并且用户将返回到上一个“活动”。

在我的情况下,我想启动一个Dialog片段,询问用户是否要丢弃之前在fListenerEditText中输入的日期。如果用户单击“确定”按钮,则数据将被丢弃,活动将关闭,用户将返回上一个活动。请注意,在我的情况下,当用户按下后退按钮键时,软键盘不会打开。

如何一起使用FocusListener和Back按钮侦听器?我在这里缺少什么?

public class EditActivity extends AppCompatActivity {

    private ListenerEditText cListenerEditText, dListenerEditText, eListenerEditText, fListenerEditText;

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

    cListenerEditText = (ListenerEditText) findViewById(id.CEditText);
    dListenerEditText = (ListenerEditText) findViewById(id.DEditText);
    eListenerEditText = (ListenerEditText) findViewById(id.EEditText);
    fListenerEditText = (ListenerEditText) findViewById(id.FEditText);

    final int stringDueDate = fListenerEditText.getText().toString().replace(" ", "").length();

    cListenerEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus && fListenerEditText.getText().length() > 0) {
            // add some type of Back button listener here.    
            }
        }
    });

2 个答案:

答案 0 :(得分:2)

  1. 覆盖方法onBackPressed()并检查字段fListenerEditText的输入长度。如果不是0,则显示确认dialog,否则请致电super.onBackPressed()finish活动,以便在活动堆栈中显示previous

  2. 如果点击OK按钮,则只需完成EditActivity

  3. 更新EditActivity,如下所示:

    public class EditActivity extends AppCompatActivity {
    
        private ListenerEditText cListenerEditText, dListenerEditText, eListenerEditText, fListenerEditText;
    
        @Override
        protected void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(layout.activity_edit);
    
            cListenerEditText = (ListenerEditText) findViewById(id.CEditText);
            dListenerEditText = (ListenerEditText) findViewById(id.DEditText);
            eListenerEditText = (ListenerEditText) findViewById(id.EEditText);
            fListenerEditText = (ListenerEditText) findViewById(id.FEditText);
    
            ..........
            ...............
        }
    
        @Override
        public void onBackPressed() {
    
            if (cListenerEditText.hasFocus() && fListenerEditText.getText().toString().length() > 0) {
                // Show dialog
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Discard?");
                builder.setMessage("Your change will be discarded");
    
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    
                    public void onClick(DialogInterface dialog, int which) {
                        // Finish activity
                        finish();
                    }
    
                });
    
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // Do nothing
                        dialog.dismiss();
                    }
                });
    
                AlertDialog alert = builder.create();
                alert.show();
    
            } else {
                super.onBackPressed();
            }
        }
    }
    

    仅供参考,如果您想根据焦点进行额外操作,请使用cListenerEditText.hasFocus()检查焦点并在选择日期后更改焦点,只需使用cListenerEditText.requestFocus()fListenerEditText.clearFocus()

    希望这会有所帮助〜

答案 1 :(得分:1)

您可以显示新的对话框,询问用户是要放弃更改还是将其保留在 OnBackpress() onOptionSelected()

cListenerEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus && fListenerEditText.getText().length() > 0) {
            // add some type of Back button listener here.  
              onBackPressed()
            }
        }
    });

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
        .setTitle("Your dialog title")
        .setMessage("Do you want to discard the old changes")
        .setNegativeButton("No", new OnClickListener(){
          public void onClick(){
           // your task
          }
        })
        .setPositiveButton("yes", new OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                EditActivity.super.onBackPressed();
            }
        }).create().show();
}