我已经尝试了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>
答案 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)
只想感谢此处发布的所有信息。解决了我的问题(和其他人一样)。让这个工作起来非常令人沮丧。他们应该更好地简化这个例子。
尝试总结所需的更改。
将所有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);
}
}
答案 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)。
这是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 清单文件。