尝试调用资源中的虚方法 res = getResources(); [英] Attempt to invoke virtual method in Resources res = getResources();

查看:25
本文介绍了尝试调用资源中的虚方法 res = getResources();的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用处理程序更改活动的背景颜色,但出现错误尝试调用虚拟方法".

I am trying to change the background color of an activity using a handler, but I am getting an error "Attempt to invoke virtual method".

这是我的代码

public class MainActivity extends AppCompatActivity {

private EditText editTextUser, editTextPass;
private RelativeLayout relativeLayoutMain;
private Random random = new Random();
Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    relativeLayoutMain = (RelativeLayout) findViewById(R.id.relativeLayoutMain);

    Button btnSignIn = (Button) findViewById(R.id.buttonSignIn);
    btnSignIn.setEnabled(false);

    handler.postDelayed(runner, 2000);

    Button buttonSignUp = (Button) findViewById(R.id.buttonSignUp);
    buttonSignUp.setText("Not registered? CLICK HERE");

    editTextUser = (EditText) findViewById(R.id.editTextUser);
    editTextPass = (EditText) findViewById(R.id.editTextPassword);


    if (editTextUser.getText().toString() != null && editTextPass.getText().toString() != null) {
        btnSignIn.setEnabled(true);
    }

}

android.content.res.Resources res = getResources();
int[] clrItems = res.getIntArray(R.array.color_background);

List<int[]> arrayOfColor = new ArrayList<int[]>();

public List<int[]> getArrayOfColor() {
    arrayOfColor.add(clrItems);
    return arrayOfColor;
}

Runnable runner = new Runnable() {
    @Override
    public void run() {
        Log.e("run: ", "call");

        Bitmap bitmap = Bitmap.createBitmap(612, 612, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        final int clr = 0xFF424242;
        final Paint paint = new Paint();
        final Rect destRect = new Rect((612-bitmap.getWidth())/2,
                24,
                (612)-(612-bitmap.getWidth())/2,
                612-24);
        final RectF rectF = new RectF(destRect);
        final Rect srcRect = new Rect(0, 0, bitmap.getWidth(), 612);
        final float roundPx = 612;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(clr);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, srcRect, destRect, paint);

        GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, new int[]{0xFF616261, 0xFF131313});
        gd.setCornerRadius(0f);
        relativeLayoutMain.setBackground(gd);
        handler.postDelayed(runner, 4000);
    }
};

public void login(View view) {
    intent = new Intent(this, HomeActivity.class);
    startActivity(intent);
}

public void register(View view) {
    intent = new Intent(this, SignUpActivity.class);
    startActivity(intent);
}
}

这是我的日志.

 08-31 16:29:47.122 13152-13152/com.example.salimshivani.student E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.example.salimshivani.student, PID: 13152
 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.salimshivani.student/com.example.salimshivani.student.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3132)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
 at android.app.ActivityThread.access$1100(ActivityThread.java:229)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:148)
 at android.app.ActivityThread.main(ActivityThread.java:7325)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
 at android.content.ContextWrapper.getResources(ContextWrapper.java:92)
 at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81)
 at com.example.salimshivani.student.MainActivity.<init>(MainActivity.java:241)
 at java.lang.Class.newInstance(Native Method)
 at android.app.Instrumentation.newActivity(Instrumentation.java:1096)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3122)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 
 at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:148) 
 at android.app.ActivityThread.main(ActivityThread.java:7325) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

请帮助我不断移动活动的背景颜色在哪里出错.

Please help me where i am wrong to move the backgroundColor constantly of the activity.

提前致谢

推荐答案

您调用方法 getResources() 作为类初始化的一部分(在任何方法之外,因此它将作为一部分执行构造函数)

You invoke the method getResources() as part of the class initialisation (outside of any method, so it will be executed as part of the constructor)

此时,Activity 实例尚不存在,因此它可能不会调用需要该实例存在的方法.

At this point, the Activity instance does not yet exist so it may not call methods which require the existence of the instance.

会导致 Exception 的语句,因为它们利用了 Activity 是一种 Context 的事实:

Statements which will cause an Exception because they take advantage of the fact that an Activity is a kind of Context:

android.content.res.Resources res = getResources();
int[] clrItems = res.getIntArray(R.array.color_background);

android.content.res.Resources res = getResources();
int[] clrItems = res.getIntArray(R.array.color_background);

另一方面,以下语句不会引起问题,因为它只是普通的旧 Java:

The following statement on the other hand will not cause problems because it's just plain old Java:

List arrayOfColor = new ArrayList();

List arrayOfColor = new ArrayList();

只需将问题陈述"粘贴到方法中,例如onCreate()

Simply paste the "problem statements" into a method, e.g. onCreate()

// declare here
android.content.res.Resources res;
int[] clrItems; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // initialise here
    res = getResources();   
    clrItems = res.getIntArray(R.array.color_background);

    relativeLayoutMain = (RelativeLayout) findViewById(R.id.relativeLayoutMain);

    Button btnSignIn = (Button) findViewById(R.id.buttonSignIn);
    btnSignIn.setEnabled(false);

    ...
}

这篇关于尝试调用资源中的虚方法 res = getResources();的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆