Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
880 views
in Technique[技术] by (71.8m points)

android - Attempt to invoke virtual method in Resources 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".

Here is my code

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);
}
}

And here is my logcat.

 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.

Thanks in advance

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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)

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

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);

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

List arrayOfColor = new ArrayList();

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);

    ...
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...