我在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.
}
}
});
答案 0 :(得分:2)
覆盖方法onBackPressed()
并检查字段fListenerEditText
的输入长度。如果不是0
,则显示确认dialog
,否则请致电super.onBackPressed()
至finish
活动,以便在活动堆栈中显示previous
。
如果点击OK
按钮,则只需完成EditActivity
。
更新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();
}