2011-02-07 4 views
1

나는 EditText 필드에서 사용자 입력을 검사하여 조건부를 트리거하려고합니다. 내가 EditText에서 logcat 로그 문자열을 인쇄 할 때 데이터 변경을 볼 수 있지만 값을 확인하는 String 함수는 항상 false를 반환합니다.Android에서 문자열 및 EditText 기능 문제가 발생했습니다.

if(((EditText)findViewById(R.id.drv_in)).getText().toString().equals("")) { 
    TX_FAIL_TEXT = "Missing Driver ID!"; 
} 
Log.e("SMSDRVERR", ((EditText)findViewById(R.id.drv_in)).getText().toString()); 

이 코드는 항상 "누락 된 드라이버 ID!"를 표시합니다. 내가 성공하지, 이러한 다른 조건문을 시도했다 : 나는 데이터가 있음을 확인할 수 있습니다

(((EditText)findViewById(R.id.drv_in)).getText().toString().isEmpty()) //does not compile, says cannot find symbol, but the function is in the Android documentation 
(((EditText)findViewById(R.id.drv_in)).getText().toString().length() < 1) //returns false, even for strings of length > 1 

, 참으로, 로그 캣보고 내 데이터를 확인할 수 없음 널 (null)는 로그에 표시되지 않습니다. 조건부가 뭐가 잘못 됐어?

첫 번째 전송시 데이터를 삽입하지 않으면 오류가 발생하지 않습니다. 첫 번째 전송이 실패하면 데이터를 변경했는지 여부에 관계없이 모든 후속 전송이 실패합니다. 또한, 첫 번째 전송을 통과하면 모든 후속 전송을 전달합니다.

또한 아래의 전체 코드에 게시 된 다른 조건문도 있으며,이 조건문은 버튼을 처음 클릭 할 때만 평가됩니다.

transmit.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     //data validation 
     /////////////////////// 
     boolean valid = true; 
     if(((EditText)findViewById(R.id.drv_in)).getText().toString().equals("")) { 
      TX_FAIL_TEXT = "Missing Driver ID!"; 
      showDialog(DIALOG_FAIL); 
      TX_FAIL_TEXT = "Transmission Failed!"; //reset the dialog fail text to default 
      valid = false; 
     } 
     Log.e("SMSDRVERR", ((EditText)findViewById(R.id.drv_in)).getText().toString()); 
     if(custSpn.getSelectedItemPosition() == 0) { 
      TX_FAIL_TEXT = "Missing Customer Selection!"; 
      showDialog(DIALOG_FAIL); 
      TX_FAIL_TEXT = "Transmission Failed!"; //reset the dialog fail text to default 
      valid = false; 
     } 
     if(prdSpn.getSelectedItemPosition() == 0) { 
      TX_FAIL_TEXT = "Missing Product Selection!"; 
      showDialog(DIALOG_FAIL); 
      TX_FAIL_TEXT = "Transmission Failed!"; //reset the dialog fail text to default 
      valid = false; 
     } 
     if(((Cursor)prdSpn.getItemAtPosition(prdSpn.getSelectedItemPosition())).getString(prdSpn.getSelectedItemPosition()).contains("CAR") || 
       ((Cursor)prdSpn.getItemAtPosition(prdSpn.getSelectedItemPosition())).getString(prdSpn.getSelectedItemPosition()).contains("AUTO") || 
       ((Cursor)prdSpn.getItemAtPosition(prdSpn.getSelectedItemPosition())).getString(prdSpn.getSelectedItemPosition()).contains("TRUCK") 
      ) { 
      //must have make, license# and 1vin 
      if(((EditText)findViewById(R.id.make_in)).getText().toString().equals("")) { 
       TX_FAIL_TEXT = "Vehicle Entry:\n Missing Make/Model!"; 
       showDialog(DIALOG_FAIL); 
       TX_FAIL_TEXT = "Transmission Failed!"; //reset the dialog fail text to default 
       valid = false; 
      } 
      if(((EditText)findViewById(R.id.tag_in)).getText().toString().equals("")) { 
       TX_FAIL_TEXT = "Vehicle Entry:\n Missing Tag Number!"; 
       showDialog(DIALOG_FAIL); 
       TX_FAIL_TEXT = "Transmission Failed!"; //reset the dialog fail text to default 
       valid = false; 
      } 
      if(((EditText)findViewById(R.id.vin1_in)).getText().toString().equals("") || 
        ((EditText)findViewById(R.id.vin2_in)).getText().toString().equals("") || 
        ((EditText)findViewById(R.id.vin3_in)).getText().toString().equals("") || 
        ((EditText)findViewById(R.id.vin4_in)).getText().toString().equals("") || 
        ((EditText)findViewById(R.id.vin5_in)).getText().toString().equals("") || 
        ((EditText)findViewById(R.id.vin6_in)).getText().toString().equals("") || 
        ((EditText)findViewById(R.id.vin7_in)).getText().toString().equals("") || 
        ((EditText)findViewById(R.id.vin8_in)).getText().toString().equals("") 
       ) { 
       TX_FAIL_TEXT = "Vehicle Entry:\n Missing VIN Number!"; 
       showDialog(DIALOG_FAIL); 
       TX_FAIL_TEXT = "Transmission Failed!"; //reset the dialog fail text to default 
       valid = false; 
      } 
     } 
     //Log.e("smsDRVERR",((EditText)smsActivity.this.findViewById(R.id.drv_in)).getText().toString()); 
     //begin transmission 
     /////////////////////// 
     if(valid) { 
      showDialog(DIALOG_TX_PROGRESS); 
      Thread t = new Thread(txRunnable); 
      t.start(); 
     } else { 
      //do things if needed 

     } 
    } 
+0

업데이트 : 첫 번째 전송시 데이터를 삽입하지 않으면 실패하지 않습니다. 첫 번째 전송이 실패하면 데이터를 변경했는지 여부에 관계없이 모든 후속 전송이 실패합니다. 또한, 첫 번째 전송을 통과하면 모든 후속 전송을 전달합니다. – moonlightcheese

+1

else 문이 없습니다. 따라서 실패한 경우 TX_FAIL_TEXT가 "누락 된 드라이버 ID!"상태로 유지됩니다. – I82Much

+0

죄송합니다. 원래 너무 많은 코드를 제외 시켰습니다. 약간의 수정으로 원본 게시물 아래에 전체 코드를 게시합니다. – moonlightcheese

답변

1

내가 주석으로이 게시 싶지만, 너무 긴 것 ...

내가 문제를 생각하지 않는다 당신이 생각하는 것입니다. 그러나 성공 및/또는 실패를 어떻게 감지하는지 명확하지 않아서 인 문제를 말할 수 없습니다.

가능한 모호한 점을 제거하기 위해 진단 코드를 명확히하여 시작하겠습니다. 나는 당신이 변경 좋을 것 :

if(((EditText)findViewById(R.id.drv_in)).getText().toString().equals("")) { 
    TX_FAIL_TEXT = "Missing Driver ID!"; 
} 
Log.e("SMSDRVERR", ((EditText)findViewById(R.id.drv_in)).getText().toString()); 

에 :

final String drv = (EditText)findViewById(R.id.drv_in)).getText().toString(); 
if(drv.equals("") { 
    TX_FAIL_TEXT = "Missing Driver ID!"; 
    Log.e("SMSDRVERR", "Missing ID " + drv); 
} 
else { 
    Log.e("SMSDRVERR", "Found ID" + drv); 
} 

이 텍스트를 정말 실종되었는지 여부에 대해 로그에 가능한 모호성을 제거합니다. (더 읽기 쉬운 코드도 있습니다.)

+0

주셔서 감사합니다. 제안을 반영하도록 코드를 변경했으며 재미있는 점은 실제로 조건이 만족 스럽다는 것입니다.이 코드는 실제로 대화 상자에 표시되는 텍스트 문자열 (TX_FAIL_TEXT)을 변경합니다. 내 생각 엔 Dialog가 보여 질 때마다 업데이트되는 대신 Dialog가 만들어지고 저장됩니다. 따라서 showDialog (int)에 대한 첫 번째 호출에서 대화 상자가 만들어지고 변경되지 않습니다. iirc에는 각 호출에서 Dialog를 다시 작성하는 방법이 있습니다. 귀하의 의견에 감사드립니다. – moonlightcheese

+1

@moonlightcheese :'onCreateDialog'에서 Dialog를 업데이트 할 것입니다. 문제는'onCreateDialog'는'showDialog'를 몇번이나 호출했는지에 관계없이 한 번 (!) 호출된다는 것입니다. 내 추측이 맞다면 showDialog()에 대한 호출을 가로 채길 원한다. 'onDialogCreate' 메소드는 Dialog에 대한 참조를 클래스 멤버로 저장해야합니다. 그런 다음'showDialog'를 직접 호출하는 대신'showDialog'를 호출하는 도우미 함수를 호출 한 다음 저장된 Dialog 참조를 업데이트하십시오. (나는 그것이 충분히 명확하다라고 생각한다. ..) –

+0

그것은 정확하게 그것이었다. onClick 함수의 시작 부분에서 removeDialog를 호출하면이 문제가 해결되었습니다. 감사. – moonlightcheese

0

실제로 Dialog 객체에 문제가있었습니다. 조건부는 괜찮습니다. 다이얼로그를 호출 될 다음 번에 다시

removeDialog(DIALOG_FAIL); 

이 강제로 안드로이드 다음의 onclick 메소드의 시작 부분에서, 나는에게 전화를했다.

EDIT : 나중에 참조 할 수 있도록 onPrepareDialog()를 사용하여이 작업을 수행하는 좀 더 우아한 방법이 있지만이 솔루션은 나에게 쉽습니다.

관련 문제