【发布时间】: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