如果导致程序强制关闭的条件

问题描述:

我正在做一个android应用程序,我正在考虑创建一个主题选项。那么我想要做的就是让用户点击代表主题的图像按钮。当他点击它时,我开始一个新的活动,即我将他引导到主页。另外我创建了几个整数变量,当用户点击一个按钮时,它们被设置为1。如果导致程序强制关闭的条件

然后在其他类中,我所做的只是检查变量是否为1,并取决于我应用的主题。按主题我的意思是我只是改变背景壁纸。但是这不起作用。我的意思是代码有效,但如果使用if循环来检查变量值,然后应用效果,则会导致错误。

下面是完整的代码:

package com.example.themetest; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 

public class MainActivity extends Activity implements OnClickListener{ 

    ImageButton ib1; 
    ImageButton ib2; 
    int water=0; 
    int fire=0; 


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

     ib1 = (ImageButton) findViewById(R.id.imageButton1); 
     ib2 = (ImageButton) findViewById(R.id.imageButton2); 
     ib1.setOnClickListener(this); 
     ib2.setOnClickListener(this); 



    } 


    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     switch(v.getId()){ 
     case R.id.imageButton1: 
      water = 1; 
      Intent wi = new Intent("com.example.themetest.THEME"); 
      startActivity(wi); 
      break; 

     case R.id.imageButton2: 
      fire = 1; 
      Intent fi = new Intent("com.example.themetest.THEME"); 
      startActivity(fi); 
      break; 
     } 
    } 



} 

下面是其他类,其中i检查哪些变量设置为1和应用效果。

package com.example.themetest; 

import java.io.InputStream; 

import android.app.Activity; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.widget.EditText; 
import android.widget.LinearLayout; 

public class Theme extends Activity{ 

    MainActivity main; 
    Resources res; 
    Drawable drawable; 
    LinearLayout linearLayout; 




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

     if(main.water==1){ 


      res = getResources(); 
      drawable = res.getDrawable(R.drawable.water_theme); 
      linearLayout = (LinearLayout)findViewById(R.id.ll); 
      linearLayout.setBackgroundDrawable(drawable); 
      } 
      else if(main.fire==1){ 
       res = getResources(); 
       drawable = res.getDrawable(R.drawable.fire_theme); 
       linearLayout = (LinearLayout)findViewById(R.id.ll); 
       linearLayout.setBackgroundDrawable(drawable); 
     } 
      else{ 
       res = getResources(); 
       drawable = res.getDrawable(R.drawable.ic_launcher); 
       linearLayout = (LinearLayout)findViewById(R.id.ll); 
       linearLayout.setBackgroundDrawable(drawable); 
     } 

    } 



    } 

我可以改变墙纸,而不使用if循环,但我想这样来做这是行不通的。任何人都可以告诉我为什么?

登录猫:

01-15 12:08:23.339: D/dalvikvm(273): GC_EXTERNAL_ALLOC freed 767 objects/55936 bytes in 235ms 
01-15 12:08:25.539: D/AndroidRuntime(273): Shutting down VM 
01-15 12:08:25.539: W/dalvikvm(273): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
01-15 12:08:25.559: E/AndroidRuntime(273): FATAL EXCEPTION: main 
01-15 12:08:25.559: E/AndroidRuntime(273): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.themetest/com.example.themetest.Theme}: java.lang.NullPointerException 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.os.Looper.loop(Looper.java:123) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-15 12:08:25.559: E/AndroidRuntime(273): at java.lang.reflect.Method.invokeNative(Native Method) 
01-15 12:08:25.559: E/AndroidRuntime(273): at java.lang.reflect.Method.invoke(Method.java:521) 
01-15 12:08:25.559: E/AndroidRuntime(273): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-15 12:08:25.559: E/AndroidRuntime(273): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-15 12:08:25.559: E/AndroidRuntime(273): at dalvik.system.NativeStart.main(Native Method) 
01-15 12:08:25.559: E/AndroidRuntime(273): Caused by: java.lang.NullPointerException 
01-15 12:08:25.559: E/AndroidRuntime(273): at com.example.themetest.Theme.onCreate(Theme.java:29) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-15 12:08:25.559: E/AndroidRuntime(273): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
01-15 12:08:25.559: E/AndroidRuntime(273): ... 11 more 
01-15 12:08:31.089: I/Process(273): Sending signal. PID: 273 SIG: 9 
+2

错误是什么样的?也许'NullPointerEception'因为'main'没有被初始化? – Howard

+0

我在任何地方都看不到'main'的初始化。 –

+0

这不是android的Activity类字段的工作方式。如果要将一个Activity的值传递给下一个,请使用键值对的Bundle或Intent。看看[这篇文章](http://stackoverflow.com/q/6277662/593709) –

您不能访问其他活动的变量这种方式,更好的方法(例如)是使用恒定类..

public class Constants { 
    public static int water=0; 
    public staticint fire=0; 
} 

MainActivity:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 

    switch(v.getId()){ 
    case R.id.imageButton1: 
     Constants.water = 1; 
     Intent wi = new Intent("com.example.themetest.THEME"); 
     startActivity(wi); 
     break; 

    case R.id.imageButton2: 
     Constants.fire = 1; 
     Intent fi = new Intent("com.example.themetest.THEME"); 
     startActivity(fi); 
     break; 
    } 
} 

主题:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.theme); 

    if(Constants.water==1){ 


     res = getResources(); 
     drawable = res.getDrawable(R.drawable.water_theme); 
     linearLayout = (LinearLayout)findViewById(R.id.ll); 
     linearLayout.setBackgroundDrawable(drawable); 
     } 
     else if(Constants.fire==1){ 
      res = getResources(); 
      drawable = res.getDrawable(R.drawable.fire_theme); 
      linearLayout = (LinearLayout)findViewById(R.id.ll); 
      linearLayout.setBackgroundDrawable(drawable); 
    } 
     else{ 
      res = getResources(); 
      drawable = res.getDrawable(R.drawable.ic_launcher); 
      linearLayout = (LinearLayout)findViewById(R.id.ll); 
      linearLayout.setBackgroundDrawable(drawable); 
    } 

} 
+0

好的。谢谢。我会试试这个.... – maestrosan11

+0

哦。伙计,你真棒。它现在有效.. – maestrosan11

我认为更好的方式来做到这一点是通过与意图一起选择的主题用户的名称或代码。

这可能帮助:Passing data through Intent and receiving it