2015-02-23 72 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()

是的,静态变量是丑陋的,但只要您的应用程序正在运行,您的应用程序对象将始终可用。只要应用程序没有运行,就不会再需要资源。

相关问题