Проблема запуска Android HelloTabWidget пример - NullPointerException на addTab () - PullRequest
4 голосов
/ 21 февраля 2010

Я попробовал пример Tab Layout , и я также исправил несколько опечаток в примере (и добавил все действия в манифест). Тем не менее, когда я запускаю его на эмуляторе, я получаю исключение NullPointerException в первой строке, которое говорит

tabHost.addTab (спецификация);

Так что мой вопрос, конечно же, таков. Что не так с примером, который вызвал бы это исключение? Я использую Eclipse Galileo и устанавливаю целевой пакет как Android 1.5. До сих пор у меня не было других проблем с другими примерами на сайте разработчика Android.

package com.example.hellotabwidget;

import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;

public class HelloTabWidget extends TabActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) throws RuntimeException {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Resources res = getResources(); // Resource object to get Drawables
    TabHost tabHost = getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Reusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    //final Context context = getApplicationContext();
    intent = new Intent().setClass(this, ArtistsActivity.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("artists").setIndicator("Artists",
            res.getDrawable(R.drawable.ic_tab_artists))
            .setContent(intent);
    tabHost.addTab(spec); //******** NullPointerException after running this line

    // Do the same for the other tabs
    intent = new Intent().setClass(this, AlbumsActivity.class);
    spec = tabHost.newTabSpec("albums").setIndicator("Albums",
            res.getDrawable(R.drawable.ic_tab_artists))
            .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, SongsActivity.class);
    spec = tabHost.newTabSpec("songs").setIndicator("Songs",
            res.getDrawable(R.drawable.ic_tab_artists))
            .setContent(intent);
    tabHost.addTab(spec);

    tabHost.setCurrentTabByTag("artists");
}
}

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp" />
</LinearLayout>
</TabHost>

Ответы [ 12 ]

9 голосов
/ 22 апреля 2010

Попробуйте это в своем манифесте:

<activity android:name=".AlbumsActivity"  android:label="@string/app_name"></activity> 
    <activity android:name=".ArtistsActivity"  android:label="@string/app_name"></activity> 
    <activity android:name=".SongsActivity"  android:label="@string/app_name"></activity> 
2 голосов
/ 05 сентября 2010

Сразу хочу сказать спасибо всему, что выложили здесь. Решил мою проблему (так же, как и все остальные здесь). Было очень неприятно заставить это работать. Им следовало бы действительно упростить пример намного лучше.

Чтобы попытаться суммировать необходимые изменения.

  1. добавьте 3 строки активности, которые говорит Нгета.
  2. Переместите все 3 класса активности в отдельные файлы. пример, который я использовал для моего файла SongsActivity.java (с предложениями об ошибке eclipse)

    package com.example.HelloTabWidget;
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
    public class SongsActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textview = new TextView(this);
        textview.setText("This is the Songs tab");
        setContentView(textview);
    }
    }
    
  3. Мне пришлось создать каталог res \ drawable и поместить все значки туда, плюс я сделал 3 xml файла для значков, таких как "ic_tab_songs.xml"
1 голос
/ 19 сентября 2011

Эй, сделайте следующие шаги, и я уверен, что ваша проблема исчезнет: -

Создать класс HelloTabWidget.java

package com.pericent;             //this is package name
import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
import android.widget.TabHost;

public class HelloTabWidget extends TabActivity  {

private String TAG="HelloTabWidget";

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  Resources res = getResources(); // Resource object to get Drawables
  TabHost tabHost = getTabHost();  // The activity TabHost
  TabHost.TabSpec spec;  // Resusable TabSpec for each tab
  Intent intent;  // Reusable Intent for each tab

  // Create an Intent to launch an Activity for the tab (to be reused)
  intent = new Intent().setClass(this,ArtistsActivity.class);
  Log.v(TAG,"---artist activity is called---");

  // Initialize a TabSpec for each tab and add it to the TabHost
  spec = tabHost.newTabSpec("artists").setIndicator("Artists",res.getDrawable(R.drawable.ic_tab_artists)).setContent(intent);
  tabHost.addTab(spec);


  // Do the same for the other tabs
  intent = new Intent().setClass(this,AlbumsActivity.class);
  Log.v(TAG,"---album activity is called---");
  spec = tabHost.newTabSpec("albums").setIndicator("Albums",res.getDrawable(R.drawable.ic_tab_albums)).setContent(intent);
  tabHost.addTab(spec);

  intent = new Intent().setClass(this, SongsActivity.class);
  Log.v(TAG,"---song activity is called---");
  spec = tabHost.newTabSpec("songs").setIndicator("Songs",res.getDrawable(R.drawable.ic_tab_songs)).setContent(intent);
  tabHost.addTab(spec);

  }

}

Создайте ваше второе занятие: ArtistActivity.java

package com.pericent;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class ArtistsActivity extends Activity {
 private String TAG="ArtistsActivity";
    /** Called when the activity is first created. */
    @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textview=new TextView(this);
        textview.setText("This is Artist Activity");
        setContentView(textview);
        Log.v(TAG,"---in artist activity---");
    }
}

Создайте свое третье действие: AlbumsActivity.java

package com.pericent;

import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class AlbumsActivity extends Activity{
    private String TAG="AlbumsActivity";
    @Override
    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstance);
        TextView textview_album=new TextView(this);
        textview_album.setText("This is album activity");
        setContentView(textview_album);
        Log.v(TAG,"---in album activity---");
    }

}

Создайте свое четвертое занятие: SongsActivity.java

package com.pericent;

import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class SongsActivity extends Activity{
    private String TAG="SongsActivity";
    @Override
    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstance);
        TextView textview_song=new TextView(this);
        textview_song.setText("This is song activity");
        setContentView(textview_song);
        Log.v(TAG,"---in songs activity---");
    }

}

Сделать папку в res / drawable В этой папке сделайте 3 XML-файла: код этих файлов примерно такой: -

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- When selected, use grey -->
    <item android:drawable="@drawable/ic_tab_artists_grey"
          android:state_selected="true" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawable/ic_tab_artists_white" />
</selector>

В приведенном выше коде XML мы используем два изображения, ниже приведены изображения, которые необходимо сохранить в одной папке (res / drawable).

enter image description here enter image description here

Это main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/upper">
<TabHost 
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp">
    <HorizontalScrollView android:id="@+id/ScrollView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:fillViewport="true" android:scrollbars="none">
           <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
     </HorizontalScrollView>
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp" />
    </LinearLayout>
</TabHost>
</LinearLayout>

Это AdroidManifest :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.pericent"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
       <activity android:name=".HelloTabWidget" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar" >
          <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
       </activity>
       <activity android:name=".AlbumsActivity" android:label="@string/app_name"></activity>
       <activity android:name=".ArtistsActivity" android:label="@string/app_name"></activity>   
       <activity android:name=".SongsActivity" android:label="@string/app_name" ></activity>
    </application>
</manifest> 

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

1 голос
/ 12 июля 2010

У меня была такая же проблема. Вчера я начал учебные курсы, и только у них были проблемы.

Нулевой указатель выдается в этой строке при первом вызове

tabHost.addTab(spec);

оказалось, что исправление было в манифесте XML

<activity android:name=".MyTabActivity"
      android:label="@string/app_name"
      android:theme="@android:style/Theme.NoTitleBar">
    <intent-filter>
       <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>


<activity android:name=".DateActivity"  android:label="@string/app_name"></activity> 
<activity android:name=".RandomNumActivity"  android:label="@string/app_name"></activity> 

последние два действия ранее не присутствовали, и это не получится. Я добавил их (благодаря предложению Ngetha выше!), И оно сработало отлично. В качестве примера самого учебного пособия вам нужно добавить три действия с исполнителями, альбомами и песнями, которые вам нужно будет добавить

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

Правда ли, что это так? все действия должны быть в манифесте?

0 голосов
/ 22 декабря 2010

У меня тоже были проблемы с учебником виджетов со вкладками.

Я был в состоянии решить проблему, прочитав этот пост, спасибо за ответы, ребята.

Возвращаясь к учебнику .... команда разработчиков Android может улучшить свою документацию.

Они на самом деле говорят нам добавить действия XML в манифест, они просто не очень хорошо его определяют ... вот цитата:

Обратите внимание, что это не использует макет файл. Просто создайте TextView, дайте ему некоторый текст и установите это как содержание. Дублируйте это для каждого из трех действия, и добавить соответствующие теги к Android Файл манифеста.

0 голосов
/ 30 октября 2010

решено Я получаю исключение nullPointerException после .addTab (spec) при возвращении из запущенного намерения. Я не получил ошибку при начальной записи в этом действии.

Я решил это, добавив:

TabHost tabHost = (TabHost) getTabHost (); tabHost.setCurrentTab (0); // это остановило исключение nullPointerException ..... .... tabHost.addTab (спецификация);

0 голосов
/ 25 июня 2010

Лучше, если вы застряли в таких ошибках, попробуйте Project> Clean, чтобы восстановить автоматически сгенерированные файлы.

0 голосов
/ 12 июня 2010

У меня была такая же ошибка проводной связи.

Попробуйте это:

Если вы используете eclipse, удалите ошибку, измените некоторый код (чтобы приложение перекомпилировалось), и тогда он должен работать нормально.

0 голосов
/ 01 июня 2010

Я только начинаю программировать для Android, и я тоже столкнулся с этой проблемой. Я должен сказать, что был весьма разочарован этим. Мне помогло то, что предложил Ngetha, но мне также пришлось немного отредактировать свой код. Что я заметил, так это то, что, по-видимому, Android не любит подклассифицированные действия. Совсем. Я думал, что сделаю мой код чище, инкапсулируя все, но это, видимо, не в порядке. Я должен был переместить мои классы в отдельные файлы. Я надеюсь, что это поможет другим новым программистам с той же проблемой инкапсуляции, что и у меня.

0 голосов
/ 13 мая 2010

Вот что у меня сработало:

Я изменил эту строку, чтобы использовать "художников" tabHost.setCurrentTabByTag ( "художники");

А потом добавил "." перед TabAndroid (основным названием деятельности) и добавил три действия, предложенные Нгетой.

</application>
...