运行android HelloTabWidget示例的问题 - addTab()上的NullPointerException

时间:2010-02-21 20:35:02

标签: android android-tabhost

我已经尝试了Tab Layout example,并且我还修复了示例中的少数拼写错误(并将所有活动添加到清单中)。但是,当我在模拟器上运行它时,我在第一行显示NullPointerException

  

tabHost.addTab(SPEC);

所以我的问题当然是。导致此异常的示例有什么问题?我正在使用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 个答案:

答案 0 :(得分:9)

在你的清单中试试这个:

<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> 

答案 1 :(得分:2)

只想感谢此处发布的所有信息。解决了我的问题(和其他人一样)。让这个工作起来非常令人沮丧。他们应该更好地简化这个例子。

尝试总结所需的更改。

  1. 添加3个活动线Ngetha说。
  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”

答案 2 :(得分:1)

我遇到了同样的问题。 我昨天开始教程,这是唯一一个遇到问题的教程。

第一次调用

时,该行会抛出空指针
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的例子时没有想到它。

情况确实如此吗?所有活动都必须在清单中?

答案 3 :(得分:1)

嘿,请执行以下步骤,我确信您的问题已解决: -

创建一个类 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> 

我认为这一切信息都会有所帮助,如果您有任何问题,可以随意向我询问。我总是很乐意帮助任何人。

答案 4 :(得分:0)

您应该发布更多代码,以便我们做出更好的假设。特别要确保你实例化tabHost Somewhere。

答案 5 :(得分:0)

您是否将活动放在AndroidManifest.xml中?您必须告诉应用程序您要显示的活动,否则您将获得的只是一个错误。

例如,您可以将以下xml代码放在&lt; application&gt;中。元素:

    <activity android:name=".ArtistsActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>

希望这会有所帮助。

-Surya Wijaya Madjid

答案 6 :(得分:0)

这对我有用:

我改变了这一行来使用“艺术家” tabHost.setCurrentTabByTag( “艺术家”);

然后添加了一个“。”在TabAndroid(主要活动名称)前面添加了Ngetha建议的三个活动。                                                                                                    

</application>

答案 7 :(得分:0)

我只是开始为Android编程,我也遇到了这个问题。我不得不说我很沮丧。做Ngetha建议的事情帮助了我,但我还必须编辑我的代码。我注意到的是,Android显然不喜欢分类活动。完全没有。我以为我会通过封装所有内容来使代码更清晰,但这显然不合适。我不得不将我的课程移到单独的文件中。我希望这有助于其他新程序员遇到相同的封装问题。

答案 8 :(得分:0)

我遇到了同样的有线错误。

试试这个:

如果您正在使用eclipse删除错误,请更改一些代码(以便应用程序重新编译)然后它应该可以正常工作。

答案 9 :(得分:0)

更好的是,如果您遇到此类错误,请尝试使用Project&gt;清理以重新生成自动生成的文件。

答案 10 :(得分:0)

已解决当从已启动的intent返回时,我在.addTab(spec)之后得到nullPointerException。我没有在初次进入此活动时收到错误。

我通过添加:

解决了这个问题

TabHost tabHost =(TabHost)getTabHost(); tabHost.setCurrentTab(0); //这停止了nullPointerException  ..... .... tabHost.addTab(SPEC);

答案 11 :(得分:0)

我也遇到了tab小部件教程的问题。

我是onyl能够解决这个SO帖子的问题,thansk为答案人。

回到教程...... android开发团队可以改进他们的文档。

他们确实告诉我们将XML活动添加到清单中,他们只是没有“很好地指定它......”这里是引用:

  

请注意,这不使用布局   文件。只需创建一个TextView,给它   一些文本并将其设置为内容。   对于三者中的每一个都重复这一点   活动,并添加相应的    标签到Android   清单文件。