Сбой Android ToggleButton (ресурс NullPointerException) - PullRequest
0 голосов
/ 16 августа 2011

Я новичок в Android, и я только что познакомился с ним, и я наткнулся на эту проблему с получением ресурсов.Я добавил кнопку переключения в основной макет, но когда я получаю доступ к ресурсу, а затем пытаюсь изменить текст с помощью button.setText(), приложение вылетает.

Вот соответствующий код:

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.Если я помещу эту кнопку в другой класс, приложение падает на setText().Я понятия не имею, почему он не получает ресурс правильно, возможно, проблема с макетом?

Любая помощь будет оценена.Благодарю.Приветствия.

Val

ПЕРВАЯ ЧАСТЬ РЕШЕНА: ОЧИСТИТЬ ПРОЕКТ И ЗАПУСТИТЬ ЗАТМЕНИЕ.(смеется)

РЕДАКТИРОВАТЬ (все еще открыт для возможных решений): Кажется, что перезапуск Eclipse решил проблему (чистый проект и перезапуск раньше не работал ..), иди рисунок.

НоМой вопрос является своего рода продолжением, если я получаю ресурс кнопки из другого класса, он все еще падает на setText() или любой другой попытке изменить свойства кнопки (поскольку отладчик говорит, что это также должно быть NullPointerException).Я где-то читал, что ресурс кнопки действителен только в том случае, если он извлечен из класса 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");
    }
    ..

Я знаю, этот код не имеет особого смысла, должен работать.. Есть идеи, почему предыдущая попытка получить ресурс работает, а не в другом классе?Tnx.

РЕДАКТИРОВАТЬ:

Вот мой logcat, извините за задержку.

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

FATAL EXCEPTION: main

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 (на выбранном ресурсе).Я не могу разобрать остальное.Буду признателен за любую помощь, так как я не могу решить эту проблему.Спасибо, ура.

РЕДАКТИРОВАТЬ: Возможно, проблема с контекстами?Контекст передается конструктору при создании нового потока.Нужно ли вручную извлекать ресурсы из переданной контекстной переменной или чего-то еще?

1 Ответ

1 голос
/ 16 августа 2011

Вместо этого попробуйте:

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