2011-08-15 85 views
0

我是新來的android和我剛剛讓自己熟悉它,我已經無意中提取資源的這個問題。我在主佈局上添加了一個切換按鈕,但是當我訪問資源並嘗試用button.setText()更改文本時,應用程序崩潰。Android的ToggleButton崩潰(資源NullPointerException)

下面是相關代碼:

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <com.games.tiktakboom.GameView 
     android:id="@+id/game" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 

    <ToggleButton android:layout_width="120px" android:id="@+id/toggleButton1" android:layout_height="120px" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:background="@drawable/bomb"></ToggleButton> 
    </RelativeLayout> 

MainActivity.java

public class TikTakBoom extends Activity { 
    ... 
    public ToggleButton startButton; 
    ... 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // turn off the window's title bar 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     // tell system to use the layout defined in our XML file 
     setContentView(R.layout.main); 

     // get handles to the LunarView from XML, and its LunarThread 
     mGameView = (GameView) findViewById(R.id.game); 
     mGameThread = mGameView.getThread(); 

     // set up a new game 
     mGameThread.setState(GameThread.STATE_READY); 
     Log.w(this.getClass().getName(), "SIS is null"); 

     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     mSensorManager.registerListener(mGameThread, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); 

     startButton = (ToggleButton)findViewById(R.id.toggleButton1); 
     startButton.setText("test"); 
    } 

... 

順便說一句,這是一個修改後的模板我在一些論壇或得到的東西,這就是爲什麼奇怪的評論。

一旦我嘗試使用findViewById來獲取te資源,該應用就會崩潰。如果我把這個按鈕放在另一個類中,那麼應用程序在setText()上崩潰。我不知道爲什麼它不正確地獲取資源,可能是佈局的問題?

任何幫助,將不勝感激。謝謝。乾杯。

瓦爾

第一部分解決:清潔工程和重新啓動Eclipse。 (笑)

編輯(仍然可能的解決方案): 似乎重新啓動Eclipse解決了問題(乾淨的項目和重新啓動之前沒有工作..),去圖。

但我的問題是排序的跟進,如果我取從另一個類它仍然崩潰的setText()或任何其他atempt修改按鈕的屬性按鈕資源(只要調試器說,它也應該是空指針異常) 。我讀過一個地方,一個按鈕資源只有在Activity類中取得時纔有效,當時我不相信它。有沒有這個或更好的真理,有什麼理由呢?

相關的代碼段:

class GameView extends SurfaceView implements SurfaceHolder.Callback { 
class GameThread extends Thread implements SensorEventListener { 
    .. 
    ToggleButton startButton; 
    .. 
    public GameThread(SurfaceHolder surfaceHolder, Context context, 
      Handler handler) { 
     // get handles to some important objects 
     mSurfaceHolder = surfaceHolder; 
     mHandler = handler; 
     mContext = context; 

     mBomb = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bomb); 

     startButton = (ToggleButton)findViewById(R.id.toggleButton1); 
    } 
    .. 
    /* Callback invoked when the surface dimensions change. */ 
    public void setSurfaceSize(int width, int height) { 
     // synchronized to make sure these all change atomically 
     synchronized (mSurfaceHolder) { 
      mCanvasWidth = width; 
      mCanvasHeight = height; 
     } 

     mBomb = Bitmap.createScaledBitmap(mBomb, (int)(mCanvasHeight/4), (int)(mCanvasHeight/4), true); 

     startButton.setTextOn("test"); 
    } 
    .. 

我知道,這個代碼並沒有太大的意義,應該工作壽..任何想法,爲什麼以前atempt獲取資源的工作,而不是在另一類? TNX。編輯:

這是我的logcat,抱歉的延遲。

08-17 00:48:46.891: WARN/dalvikvm(30139): threadid=1: thread exiting with uncaught exception (group=0x400207d8) 

致命異常:主

了java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.games.tiktakboom/com.games.tiktakboom.TikTakBoom}: android.view。 InflateException:二進制XML文件6號線:錯誤 充氣類com.games.tiktakboom.GameView

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685) 
at android.app.ActivityThread.access$2300(ActivityThread.java:126) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4633) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at dalvik.system.NativeStart.main(Native Method) 

引起:android.view。InflateException:二進制XML文件線#6: 錯誤充氣類com.games.tiktakboom.GameView

at android.view.LayoutInflater.createView(LayoutInflater.java:513) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:200) 
at android.app.Activity.setContentView(Activity.java:1647) 
at com.games.tiktakboom.TikTakBoom.onCreate(TikTakBoom.java:100) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633) 
... 11 more 

所致:java.lang.reflect.InvocationTargetException

at com.games.tiktakboom.GameView.<init>(GameView.java:354) 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:446) 
at android.view.LayoutInflater.createView(LayoutInflater.java:500) 
... 21 more 

造成的:顯示java.lang.NullPointerException

at com.games.tiktakboom.GameView$GameThread.<init>(GameView.java:101) 
... 25 more 

力整理活動com.games.tiktakboom/.TikTakBoom

至於說,日誌指向一個NullPointerException(在獲取資源)。我無法解決其餘問題。任何幫助,將不勝感激,因爲我不能似乎能夠解決這個問題。謝謝,歡呼聲。

編輯: 或許與環境的問題嗎?在構建新線程時,上下文將傳遞給構造函數。我是否必須手動從傳遞的上下文變量中獲取資源?

+0

你可以發表你的logcat的? –

+0

你有沒有嘗試清理項目。這修復了大量的資源問題 – Pyrodante

+0

確定這是很奇怪的,我沒有嘗試乾淨,那是我的第一個想法,我重新啓動Eclipse的,沒有工作。現在,我也同樣和它的作品..芹苴它仍然如果我從另一個類獲取資源是不行的,是有原因的按鈕資源有活動類中要獲取一個特別的原因?..謝謝你的幫助,我會保持線程現在打開並編輯我的帖子。 – valekovski

回答

1

相反,嘗試:

startButton.setTextOn("test"); 
startButton.setTextOff("test"); 
相關問題