Как решить исключение нулевого указателя при попытке заполнить ViewStub? - PullRequest
1 голос
/ 01 августа 2010

довольно долго я пытался решить проблему с исключением пустых указателей при заполнении ViewStub.То, что я пытаюсь сделать, находится в SlidingDrawer, который содержит некоторые imageButtons и ViewStubs для заполнения ViewStubs при нажатии ImageButton.Я следовал Обзор класса ViewStub , чтобы создать ViewStubs, но я все еще получаю исключение Null Pointer.Если бы кто-то мог помочь мне здесь, это было бы здорово, потому что я действительно больше не знаю, что мне делать, чтобы решить эту проблему ... Я опубликую свой код ниже

Большое спасибо заранее!


Вот часть моего кода, вызывающая исключение:

btnExposure = (ImageButton) findViewById(R.id.button_exposure);

        btnExposure.setOnClickListener(new OnClickListener()
        {

         @Override
   public void onClick(View v) {
          try{   
           ViewStub stub = (ViewStub) findViewById(R.id.stub_exposure);
           importStub = stub.inflate();
          }catch (Exception e){
                 Log.e("ERROR", "Error in Code:" +e.toString());}
   }
        });

Это XML-файл DrawingSlider, содержащий ViewStub:

<?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"
   android:background="@drawable/shape_background_gradient"
         >
     <LinearLayout
      android:layout_width="205px"
      android:layout_height="155px"
      android:background="#FFCCCCCC"
      android:id="@+id/VideoViewHolder"
      android:padding="2.5px"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="5px"
      android:layout_marginBottom="5px"
      >
  <VideoView
   android:layout_width="200px"
   android:layout_height="150px"
   android:id ="@+id/VideoViewEdit"
   android:layout_centerHorizontal="true"

   >
  </VideoView>
  </LinearLayout>
  <ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/VideoViewHolder">
   <TableLayout
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:stretchColumns="0">
    <TableRow
      android:background="@drawable/shape_track_background"
      android:padding="5px"
      >
     <ImageView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:src="@drawable/ic_editor_videotrack"
          android:padding="5px"
          android:layout_gravity="left"/>

    </TableRow>
    <TableRow
      android:background="@drawable/shape_track_background"
      android:padding="5px"
      >
      <ImageView android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:src="@drawable/ic_editor_audiotrack"
          android:padding="5px"
          android:layout_gravity="left"/>


    </TableRow>
    <TableRow
      android:background="@drawable/shape_track_background"
      android:padding="5px"
      >
     <ImageButton android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:src="@drawable/ic_editor_add_media"
          android:padding="5px"
          android:layout_gravity="left"
          />
    </TableRow>
   </TableLayout>
  </ScrollView>
 <SlidingDrawer
     android:id="@+id/drawer"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
  android:orientation="horizontal"
     android:handle="@+id/handle"
     android:content="@+id/content">

     <ImageView
         android:id="@id/handle"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/slider_handle"
         />

     <LinearLayout
         android:id="@id/content"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:orientation="vertical">
        <ImageButton 
         android:id="@+id/button_exposure"
         android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#77000000"
   android:src="@drawable/ic_slider_exposure"
   android:padding="5px"
   android:layout_marginBottom="1px"
   android:layout_gravity="left"/>
        <ImageButton 
         android:id="@+id/button_properties"
         android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#77000000"
   android:src="@drawable/ic_slider_properties"
   android:padding="5px"
   android:layout_marginBottom="1px"
   android:layout_gravity="left"/>
        <ImageButton 
         android:id="@+id/button_special_effects"
         android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#77000000"
   android:src="@drawable/ic_slider_special_effects"
   android:padding="5px"
   android:layout_marginBottom="1px"
   android:layout_gravity="left"/>
  <ImageButton 
         android:id="@+id/button_test1"
         android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#77000000"
   android:src="@drawable/ic_slider_exposure"
   android:padding="5px"
   android:layout_marginBottom="1px"
   android:layout_gravity="left"/>
        <ImageButton 
         android:id="@+id/button_test2"
         android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#77000000"
   android:src="@drawable/ic_slider_exposure"
   android:padding="5px"
   android:layout_marginBottom="1px"
   android:layout_gravity="left"/>
     </LinearLayout>
     <ViewStub
      android:id="@+id/stub_exposure"
      android:inflatedId="@+id/stub_exposure_view"

      android:layout="@layout/exposureview"

      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:background="#77000000">
     </ViewStub>
     <ViewStub
      android:id="@+id/stub_properties"
      android:inflatedId="@+id/stub_properties_view"

      android:layout="@layout/propertiesview"

      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:background="#77000000">
     </ViewStub>
     <ViewStub
      android:id="@+id/stub_special_effects"
      android:inflatedId="@+id/stub_special_effects_view"

      android:layout="@layout/specialeffectsview"

      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:background="#77000000">
     </ViewStub>
 </SlidingDrawer>
</RelativeLayout>

И этоэто макет ViewStub xml (jectionview.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"
 >
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@+String/hello"
 ></TextView>
 <SeekBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:thumb="@drawable/seek_thumb"
  android:progress="50"
  android:max="100">
 </SeekBar>

</RelativeLayout>

Ответы [ 3 ]

0 голосов
/ 02 апреля 2012

Как подозревает JRL, это потому, что findViewById(R.id.stub_exposure) не находит / видит / ловит stub_exposure, хотя идентификатор был сгенерирован в R.class, а затем метод возвращает null и когда inflate()вызывается, ничего не происходит, потому что stub все еще не инициализирован, это просто null объект.Вы можете убедиться в этом с помощью отладчика.

Таким образом, мы можем видеть, что, возможно, есть какая-то проблема с синтаксическим анализатором или компилятором XML.Я решил проблему, поместив View для использования StubView из одного выделенного XML-файла в XML-файл, где у меня был основной интерфейс с большим количеством Layout s и View s.Я поместил его в первого родителя Layer, который был LinearLayout, но мне пришлось вставить его в FrameLayout вместе с моим StubView, чтобы все Layer выглядели одинаково.Я думаю, что это должно быть важно, потому что у вас также есть StubView s внутри Layer s, но это не работает для вас.Поэтому постарайтесь поместить StubView s на разные уровни иерархии.

0 голосов
/ 21 апреля 2012

Раздувание или показ ViewStub приводит к тому, что он удаляется из макета (весь его смысл должен быть заменен другим представлением). Ваш метод onClick будет работать правильно только в первый раз. Вы должны (а) проверить нулевое значение, возвращаемое из findViewById, и (б) использовать идентификатор представления, которое вы надуваете в заглушку после инфляции.

0 голосов
/ 01 августа 2010

Видимо findViewById(R.id.stub_exposure); возвращает ноль для вас.Правильно ли вы перекомпилировали свой класс для регенерации файла R.java?

Также я заметил, что вы определили одно из свойств текста вашего текстового представления в XML-файле макета заглушки вида как android:text="@+String/hello".

Не знаю, является ли это просто опечатка или нет, но был ли R.java правильно сгенерирован?Если у вас есть существующее значение в strings.xml (обратите внимание, не в верхнем регистре), то компилятор должен пожаловаться.

Вы должны попытаться выполнить проект -> Очистить, чтобы увидеть, если вы получаете предупреждения или ошибки (если выиспользуя Eclipse).

...