2016-08-31 2 views
0

Ich versuche, die Hintergrundfarbe einer Aktivität mit einem Handler zu ändern, aber ich erhalte den Fehler "Versuch, virtuelle Methode aufzurufen".Versuch, virtuelle Methode in Ressourcen aufzurufen res = getResources();

Hier ist mein 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); 
} 
} 

Und hier meine logcat ist.

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) 

Bitte helfen Sie mir, wo ich falsch liege, die backgroundColor ständig von der Aktivität zu verschieben.

Vielen Dank im Voraus

+1

Warum erstellen Sie Ressource Objekt? Sie können direkt 'getResources() 'verwenden –

+0

Ich rufe ein Array von Farben aus Xml –

+1

direkt verwenden Sie' getResources(). getIntArray() ' –

Antwort

8

Sie rufen die Methode getResources() als Teil der Klasse Initialisierung (außerhalb irgendeines Verfahrens, so dass es als Teil des Konstruktor ausgeführt wird)

An dieser Stelle etwa die Aktivität existiert noch nicht, so dass es keine Methoden aufrufen kann, die die Existenz der Instanz erfordern.

Statements, die eine Ausnahme verursacht, weil sie die Tatsache ausnutzen, dass ein Activity ist eine Art von Context:

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

Die folgende Anweisung auf der anderen Seite keine Probleme verursachen, weil es einfach nur alte Java ist:

Liste arrayOfColor = new Arraylist();

Fügen Sie einfach die "Problemanweisungen" in eine Methode ein, z. 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

Vielen Dank für die Antwort Bruder, aber mein SDK dauert zu lange für den Bau der Gradle und sogar stoppen so pls Hilfe, wenn möglich –

+0

vielen Dank @ 0X0nosugar. es hat erfolgreich funktioniert. –

1

Warum brauchen Sie res und clrItems als Felder? Sie können jedoch so etwas tun

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

Ich brauche ** res **, um Array von xml und ** clrItems ** zu erhalten, um es zu speichern –

Verwandte Themen