【问题标题】:How do I test EditText for user content even after it loses focus?即使在失去焦点后,如何测试用户内容的 EditText?
【发布时间】:2015-09-23 02:03:37
【问题描述】:

我有一个简单的 UI 屏幕供用户在 EditText 行中输入数据,然后在第二个 EditText 行中输入日期。我有一个侦听后退按钮按下的 ListenerEditText.java 文件。问题是当用户在第一行 EditText 输入数据然后焦点移动到第二个 EditText 行时,代码不再捕获正确按下后退按钮,因为它无法识别在第一行 EditText 输入了数据 - 它出现只检查第二个 EditText 行上是否有数据。当按下后退按钮时,我希望代码能够识别第一行 EditText 和/或第二行 EditText 上有数据,然后启动 DialogFragment 以确认用户是否会丢失输入的数据。目前,代码不会“看到”第一行 EditText 上的数据,如果第二行 EditText 上没有数据,用户会被错误地带回上一屏幕。

Activity.java:

import static com.example.jdw.secondscreen.ListenerEditText.KeyImeChange;

public class CardViewActivity extends AppCompatActivity {

   private ListenerEditText myListenerEditText;
   private ListenerEditText dListenerEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cardviewinput);

        myListenerEditText = (ListenerEditText)findViewById(R.id.CEditText);
        dListenerEditText = (ListenerEditText) findViewById(R.id.DEditText);

        myListenerEditText.setKeyImeChangeListener(new KeyImeChange() {

        @Override
        public boolean onKeyIme(int keyCode, KeyEvent event) {
         int stringToDo = myListenerEditText.getText().toString().trim().length();

            if(stringToDo>0) {
                FragmentManager fm = getSupportFragmentManager();
                CreateSkycardFragment editNameDialog = new CreateSkycardFragment();
                editNameDialog.show(fm, "skycard_dialog");
                return false;
            }
            // if "dstringToDo" does not have data (the EditText input line is blank)
            // then just cancel the soft keyboard and go to the previous activity.
            else {
                InputMethodManager imm = (InputMethodManager)
                   getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(myListenerEditText.getWindowToken(), 0);
                return false;
            }
        }
    });

        dListenerEditText.setKeyImeChangeListener(new KeyImeChange() {

        @Override
        public boolean onKeyIme(int keyCode, KeyEvent event) {
            int dstringToDo = dListenerEditText.getText().toString().trim().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(dstringToDo>0) {
                FragmentManager fm = getSupportFragmentManager();
                CreateSkycardFragment editNameDialog = new CreateSkycardFragment();
                editNameDialog.show(fm, "skycard_dialog");
                return false;
            }
            // if "dstringToDo" does not have data (the EditText input line is blank)56
            // then just cancel the soft keyboard and go to the previous activity.
            else {
                InputMethodManager imm = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(dListenerEditText.getWindowToken(), 0);
                return false;
            }
        }
    });

...

【问题讨论】:

    标签: android android-edittext ime


    【解决方案1】:

    你可以这样做,

    EditText edit = (EditText)getActivity.findViewById(R.id.your id here);
    String abcd=edit.getText().toString();
    

    在第一个编辑文本上做任何验证、设置错误和其他事情。

    【讨论】:

    • 我不明白。在您的解决方案中使用“getActivity”是有帮助的关键补充吗?如果是这样,怎么做?我还需要确保对第二个 EditText 进行了数据测试。 "String abcd..." 是一个字符串还是你的意思是所有字符串?
    • 不,如果你在片段中使用它,你必须 getActivity().findViewById() 如果你在活动中这样做,则不需要 getActivity()
    【解决方案2】:

    我使用了两个选项第一个与@war_Hero 告诉的相同

    第一
    /为您的编辑文本添加验证/

            myListenerEditText.setError(null);
    
            /** Validation of View Widget **/
            if (myListenerEditText.getText().toString().equalsIgnoreCase("")) {
                myListenerEditText.requestFocus();
                myListenerEditText.setError("Please enter your name.");
            }
    
            // Second option
    
        myListenerEditText = (EditText) rootView.findViewById(your id);
        //add addTextChangedListener to your editText and define one boolean variable  boolean showPopUp=false
        myListenerEditText.addTextChangedListener(watcher);
    
    
        TextWatcher watcher = new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1,int i2) {
            showPopUp = true;// whenever text changed make showPopUp= true;
        }
        @Override
        public void afterTextChanged(Editable editable) {           
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {    
    
        }
    
    };
    
     //and then override onBackPressed
    
     @Override
    public void onBackPressed() {
    
        if (showPopUp) {
            showPopUpMessage();// showPopUpMessage will show dialog 
    
        }else{
            finish();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多