2016-08-31 38 views
0

我想改變使用處理程序的活動的背景顏色,但我收到錯誤「嘗試調用虛擬方法」。嘗試在資源中調用虛擬方法res = getResources();

這裏是我的代碼

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

這裏是我的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) 

請幫助我,我錯了,移動backgroundColor不斷的活動。

在此先感謝

+1

你爲什麼要創建資源對象?你可以直接使用'getResources()' –

+0

我正在調用xml中的一組顏色 –

+1

直接使用'getResources()。getIntArray()' –

回答

8

你調用該方法getResources()作爲類初始化的一部分(任何方法之外,所以它會作爲構造函數的一部分來執行)

此時,活動實例尚不存在,所以它可能不會調用需要實例存在的方法。

陳述,因爲它們利用以下事實:一個Activity是一種Context這將導致異常:

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

,因爲它只是普通的舊式Java,另一方面下面的語句將不會造成問題:

列表arrayOfColor =新的ArrayList();

只需將「問題陳述」粘貼到方法中,例如, 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); 

    ... 
} 
+0

非常感謝回覆兄弟,但我的SDK花了很長時間來構建gradle,甚至停止如此請儘可能幫助 –

+0

非常感謝@ 0X0nosugar。它工作成功。 –

1

爲什麼你需要資源clrItems的領域? 但是你可以這樣做

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

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

    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; 
int[] clrItems; 

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

我需要** res **從xml和** clrItems **獲取數組來存儲它 –

相關問題