android输入验证无法按预期工作

时间:2013-07-20 18:47:53

标签: android validation

我正在尝试执行简单的表单验证,我使用EditText.setError()来通知用户错误的输入或空白字段。不幸的是,当我这样做时,只有在我提交不完整的表单后再次单击该字段时才显示错误。这很奇怪,因为我希望它在我点击按钮并显示不完整时立即显示。

我认为它与进行验证的代码的位置有关?以下是我的代码:

public class AddDiscountActivity extends Activity implements OnItemSelectedListener{

    String shopCategory;
    Spinner spinner;

    String shopName;
    String shopCity;
    String shopLocation;
    String discountRate;
    String discountDuration;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.adddiscount_activity);
         spinner = (Spinner) findViewById(R.id.categoriesSpinner);
        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.categoriesArray, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    }

    public void SubmitData(View view)
    {

        new PostDataAsyncTask().execute();
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) 
    {
        // TODO Auto-generated method stub

        shopCategory = spinner.getItemAtPosition(pos).toString();
        Log.v("SHOP CATEGORY***********: ", shopCategory);
    }





    public class PostDataAsyncTask extends AsyncTask<String, String, String> 
    {
        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute()
        {
            progressDialog= ProgressDialog.show(AddDiscountActivity.this, "Please Wait","Update Ads listings", true);

            //do initialization of required objects objects here                
        };  

        @Override
        protected String doInBackground(String... strings) {
            // TODO Auto-generated method stub
            try {
                postAdData();

            } catch (NullPointerException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

         @Override
         protected void onPostExecute(String lenghtOfFile) {
             // do stuff after posting data
             super.onPostExecute(lenghtOfFile);
             progressDialog.dismiss();
             //Intent intent = new Intent(MainActivity.this, ThankYouAcitivty.class);
            // startActivity(intent);

         }

    }

    private void postAdData() throws JSONException{
        try{
            // url where the data will be posted
            String postReceiverUrl = "http://hye.com/displaypost.php";

            // HttpClient
            HttpClient httpClient = new DefaultHttpClient();

            // post header
            HttpPost httpPost = new HttpPost(postReceiverUrl);
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            // add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);

            //All user input
            EditText shopNameEditText = (EditText)findViewById(R.id.shopName);
            EditText shopLocationEditText = (EditText)findViewById(R.id.shopLocation);
            EditText shopCityEditText = (EditText)findViewById(R.id.shopCity);
            EditText discountRateEditText = (EditText)findViewById(R.id.shopDiscount);
            EditText discountDurationEditText = (EditText)findViewById(R.id.shopDiscountDuration);

            shopNameEditText.getText().toString();
            shopLocationEditText.getText().toString();
            shopCityEditText.getText().toString();
            discountRateEditText.getText().toString();
             discountDurationEditText.getText().toString();


            /*******Fields Validation*********/
             if(shopNameEditText.getText().toString().length() == 0)
                 shopNameEditText.setError("يجب ادخال اسم المحل");
             if(shopLocationEditText.getText().toString().length() == 0)
                 shopLocationEditText.setError("يجب ادخال العنوان");
             if(shopCityEditText.getText().toString().length() == 0)
                 shopCityEditText.setError("يجب ادخال المدينة");
             if(discountRateEditText.getText().toString().length() == 0)
                 discountRateEditText.setError("يجب ادخال نسبة التخفيض");


            /*********************************/

            nameValuePairs.add(new BasicNameValuePair("name", shopName));
            nameValuePairs.add(new BasicNameValuePair("location", shopLocation));
            nameValuePairs.add(new BasicNameValuePair("city", shopCity));
            nameValuePairs.add(new BasicNameValuePair("rate", discountRate));
            nameValuePairs.add(new BasicNameValuePair("duration", discountDuration));
            nameValuePairs.add(new BasicNameValuePair("category", shopCategory));

            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));

            // execute HTTP post request

            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity resEntity = response.getEntity();

            if (resEntity != null) {

                String responseStr = EntityUtils.toString(resEntity).trim();
                Log.v("", "Response: " +  responseStr);

                // you can add an if statement here and do other actions based on the response
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3 个答案:

答案 0 :(得分:1)

尝试将 //所有用户输入// //字段验证 // 置于 public void SubmitData(View view)内并使用{{ 1}}

您还将获得if{} else{},因为您没有为

分配任何值
null pointer Exception

所以您的String shopName; String shopCity; String shopLocation; String discountRate; String discountDuration; 应该是这样的:

public void SubmitData(View view)

答案 1 :(得分:0)

这是预期的行为。请注意EditText扩展了TextView类。并且,您正在使用的方法:setError(CharSequence)EditText的{​​{1}}继承。

以下是它的目的:

  

将TextView的右手复合drawable设置为“error”   图标并设置将在弹出窗口中显示的错误消息   TextView具有焦点。图标和错误消息将重置为   当任何键事件导致TextView文本发生更改时,返回null。如果   错误为空,将清除错误消息和图标。

遇到点击时,EditText失去焦点并等待它重新获得焦点以发布错误。

要向用户显示错误,而不是调用TextView,您可以使用setError(CharSequence)在EditText中设置警告文字。您也可以在EditText上调用myEditText.setText("Required")以在requestFocus()之后立即显示错误,但我不确定如果出现2个或更多错误,这会出现什么情况。

答案 2 :(得分:0)

我建议做的是使用TextWatcher。如果你这样做,我相信这些步骤会有所帮助:

首先,实现android.text.TextWatcher

其次,实现必要的方法,最重要的是afterTextChanged(可编辑)

第三,为EditText的

添加textlisteners

例如......

EditText shopNameEditText = (EditText)findViewById(R.id.shopName);
shopNameEditText.addTextChangedListener(this);

@Override
public void afterTextChanged(Editable s) {
     //check validation
     if(shopNameEditText.getText().toString().length() == 0){
          ...
     }
}