Исключение нулевого указателя при назначении представления для действия? - PullRequest
2 голосов
/ 27 июля 2010

Я создал действие для обработки жестов в моей игре для Android и хочу, чтобы оно реагировало на жест в любом месте экрана, но я получаю эту ошибку в журнале:

07-27 13:55:07.268: ERROR/AndroidRuntime(751): java.lang.NullPointerException
07-27 13:55:07.268: ERROR/AndroidRuntime(751):     at android.app.Activity.findViewById(Activity.java:1637)
07-27 13:55:07.268: ERROR/AndroidRuntime(751):     at com.darius.android.distractions.DistractionsView$DistractionsThread$GestureActivity.onCreate(DistractionsView.java:282)
07-27 13:55:07.268: ERROR/AndroidRuntime(751):     at com.darius.android.distractions.DistractionsView$DistractionsThread.doStart(DistractionsView.java:559)
07-27 13:55:07.268: ERROR/AndroidRuntime(751):     at com.darius.android.distractions.DistractionsView$DistractionsThread.doKeyDown(DistractionsView.java:829)
07-27 13:55:07.268: ERROR/AndroidRuntime(751):     at com.darius.android.distractions.DistractionsView.onKeyDown(DistractionsView.java:1278)

Я понимаю, что мне нужно выделить представление для действия, и, как вы увидите в моем XML, представление, называемое жестами, будет служить этой цели, но я продолжаю получать ошибки инфляции при попытке раздувать представление. Раньше, когда это случилось со мной, это было неправильное написание имени представления в XML, но на этот раз я не думаю, что это так.

Как правильно назначить представление "жест" для этого действия, чтобы предотвратить ошибки?

Я надеюсь, что кто-то знает ответ и может помочь мне !! Большое спасибо

Я определил свою деятельность в своем коде так:

public class GestureActivity extends Activity implements GestureOverlayView.OnGesturePerformedListener{

        public void onCreate(Bundle savedInstanceState){

        GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);

        gestures.addOnGesturePerformedListener(this);
            Log.w(getClass().getName(), "GESTURE ACTIVITY CREATED");
                // Load the gesture library
                Log.w(getClass().getName(), "LOADING GESTURE LIBRARY");
                mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
                if(!mLibrary.load()){
                    finish();
                }
            /*  
        GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
        gestures.addOnGesturePerformedListener(this);
        Log.w(getClass().getName(), "GESTURE ACTIVITY CREATED");
        */
        }

        public void onStart(){
            //I replicated the code here from onCreate but will change this!!
GestureOverlayView gestures = (GestureOverlayView) findViewById   (R.id.gestures);
            gestures.addOnGesturePerformedListener(this);
            Log.w(getClass().getName(), "GESTURE ACTIVITY CREATED");
                // Load the gesture library
                Log.w(getClass().getName(), "LOADING GESTURE LIBRARY");
                mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
                if(!mLibrary.load()){
                    finish();
                }


        }




        public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture){ ...}
 }

Я создал действие в главном потоке в его методе doStart (), сказав:

GestureActivity mGestureActivity = new GestureActivity();
mGestureActivity.onCreate(null);

И мой XML-макет выглядит так:

<?xml version="1.0" encoding="utf-8"?>



<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>


<com.darius.android.distractions.DistractionsView
  android:id="@+id/distractions_layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/>

<android.gesture.GestureOverlayView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gestures"
android:layout_width="match_parent"
android:layout_height="match_parent"

android:gestureStrokeType="multiple"
android:eventsInterceptionEnabled="true"/>


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
      android:id="@+id/text"
              android:text="Hello"
              android:visibility="visible"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerInParent="true"
      android:gravity="center_horizontal"
      android:textColor="#88ffffff"
      android:textSize="24sp"/>
 <TextView  android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="@string/concentration_bar"
            android:textColor = "#EB0000"
            android:textSize="10sp"
            android:id="@+id/conbartext" 
            android:visibility="visible"            

            ></TextView>
</RelativeLayout>

1 Ответ

2 голосов
/ 27 июля 2010

findViewById() требует использования setContentView() или вызова в представлении. поэтому я бы посоветовал вам либо вызвать setContentView (R.layout.nameOfYourXmlfile), либо раздувать его инфлятором Layout.

...