2015-02-23 73 views
-1

我想驗證我的文本框。我創建了一個具有驗證的Java類。我正在使用setError(味精,圖標);如何使用getResources()爲非活動類

事情是這樣的:

public class Validate 
{ 

public static boolean hasText(EditText editText) 
{ 
    String text = editText.getText().toString().trim(); 
    editText.setError(null); 

    if (text.length() == 0) 
    { 
     errorIcon = context.getResources().getDrawable(R.drawable.alert); 
     errorIcon.setBounds(new Rect(0, 0, errorIcon.getIntrinsicWidth(), errorIcon.getIntrinsicHeight())); 
     editText.setError((REQUIRED_MSG), errorIcon); 
     return false; 
    } 

    return true; 
    } 
} 

而且我的活動的java文件中有這樣的:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{  
     fname =(EditText)findViewById(R.id.fname); 
     fname.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) 
     { 
      Validate.hasText(fname); 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){} 
    }); 

我試過如下:

public Validate(Context context) 
{ 
    this.context = context; 
} 
} 

我收到以下錯誤:

02-23 13:30:58.718: E/AndroidRuntime(1334): FATAL EXCEPTION: main 
02-23 13:30:58.718: E/AndroidRuntime(1334): java.lang.NullPointerException 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at com.zin.testText.Text_Validate.hasText(Text_Validate.java:65) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at com.zin.testText.Text_Form$1.afterTextChanged(Text_Form.java:107) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.widget.TextView.sendAfterTextChanged(TextView.java:7320) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9073) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:673) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:197) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:279) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.os.Looper.loop(Looper.java:137) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at java.lang.reflect.Method.invoke(Method.java:525) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-23 13:30:58.718: E/AndroidRuntime(1334):  at dalvik.system.NativeStart.main(Native Method) 

有人可以幫我解決這個問題嗎?

回答

4

不需要單獨傳遞上下文來訪問getResources()方法。因爲已經經過EditTexthasText所以使用editText.getContext()調用getResources()方法:

errorIcon = editText.getContext().getResources().getDrawable(R.drawable.alert); 
0

你可以在你的方法一個額外的變量情況下像下面的代碼 並調用該方法從這種方法你的活動通過活動情境。

public static boolean hasText(EditText editText ,Context context) 
{ 
    String text = editText.getText().toString().trim(); 
    editText.setError(null); 

    if (text.length() == 0) 
    { 
     errorIcon = context.getResources().getDrawable(R.drawable.alert); 
     errorIcon.setBounds(new Rect(0, 0, errorIcon.getIntrinsicWidth(), errorIcon.getIntrinsicHeight())); 
     editText.setError((REQUIRED_MSG), errorIcon); 
     return false; 
    } 

    return true; 
    } 
0

您可以覆蓋Application類,在Application.onCreate()設置靜態變量的應用實例gInstance,然後調用gInstance.getResources()

是的,靜態變量是醜陋的,但只要您的應用程序正在運行,您的應用程序對象將始終可用。只要應用程序沒有運行,就不會再需要資源。

相關問題