2013-07-20 48 views
1

我想执行简单的窗体验证,因此我使用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(); 
     } 
    } 

回答

1

尝试把//所有的用户输入// //字段的验证 // public void SubmitData(View view)和使用if{} else{}

您还将获得null pointer Exception,因为你没有给予任何价值到

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

sopublic void SubmitData(View view)应该是这样:

public void SubmitData(View view) 
    { 
//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); 
     if(shopNameEditText.getText().toString().length() == 0) 
      shopNameEditText.setError("يجب ادخال اسم المحل"); 
     else if(shopLocationEditText.getText().toString().length() == 0) 
      shopLocationEditText.setError("يجب ادخال العنوان"); 
     else if(shopCityEditText.getText().toString().length() == 0) 
      shopCityEditText.setError("يجب ادخال المدينة"); 
     else if(discountRateEditText.getText().toString().length() == 0) 
      discountRateEditText.setError("يجب ادخال نسبة التخفيض"); 
      else 
       { 
       shopName = shopNameEditText.getText().toString(); 
       shopLocation = shopLocationEditText.getText().toString(); 
       shopCity = shopCityEditText.getText().toString(); 
       discountRate = discountRateEditText.getText().toString(); 
       discountDuration = discountDurationEditText.getText().toString(); 

        new PostDataAsyncTask().execute(); 
       } 

    } 
+0

当我这样做,我只要一按一下按钮,应用程序崩溃。任何理由为什么或如何修复? –

+0

投掷nullpointerexception –

+0

@sys_debug看到我更新的答案!如果仍然抛出任何异常让我知道! –

0

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

下面是它的目的是做:

设置的TextView的右手复合绘制的“错误” 图标,设置要显示在弹出时 错误消息TextView有焦点。当任何关键事件导致TextView文本更改时,图标和错误消息将被重置为 null。如果 错误为空,则错误消息和图标将被清除。

当遇到点击后,的EditText失去焦点,并等待,直到它重新获得焦点张贴错误。

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

0

我会推荐做的是使用TextWatcher。如果你这样说,我相信这些措施将有助于:

一是落实android.text.TextWatcher

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

三,为您的EditText添加文本侦听器

例如...

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

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