我是 android 新手,我刚刚开始熟悉它,并且在获取资源时偶然发现了这个问题。我在主布局上添加了一个切换按钮,但是当我访问资源然后尝试更改button.setText()
应用程序崩溃的文本时。
以下是相关代码清单:
主要的.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()
。我不知道为什么它不能正确获取资源,可能是布局问题?
任何帮助,将不胜感激。谢谢。干杯。
瓦尔
第一部分已解决:清理项目并重新启动 ECLIPSE。(哈哈)
编辑(仍然为可能的解决方案打开):似乎重新启动 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");
}
..
我知道,这段代码没有多大意义,应该可以工作。关于为什么先前尝试获取资源的任何想法都有效,而不是在另一个类中?肿瘤坏死因子。
编辑:
这是我的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(在获取的资源上)。剩下的我看不出来。任何帮助将不胜感激,因为我似乎无法解决这个问题。谢谢,干杯。
编辑:也许是上下文的问题?构造新线程时,上下文将传递给构造函数。我是否必须从传递的上下文变量或其他东西中手动获取资源?