【问题标题】:null object reference on android.widget.TabHost.setCurrentTab(int) [duplicate]android.widget.TabHost.setCurrentTab(int) 上的空对象引用 [重复]
【发布时间】:2016-03-06 06:10:33
【问题描述】:

我正在与Tabhost 合作一个项目,我必须通过检测“手势”来实现滑动功能。下面是我的代码

public class GameItemListActivity extends TabActivity implements ViewPager.OnPageChangeListener {
public TabHost host;
private ViewPager pager;
GestureDetectorCompat gestureDetectorCompat;
private GestureDetector gestureScanner;
public int currentTabposition;
public TabHost.TabSpec spec;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);
    host = (TabHost) findViewById(android.R.id.tabhost);

   // pager = (ViewPager) findViewById(R.id.pager);
    Download_Class.applicationContext=GameItemListActivity.this;
    host.setup();

    spec = host.newTabSpec("tab1");
    spec.setContent(new Intent(this, Action_Activity.class));
    spec.setIndicator("Action");
    host.addTab(spec);

    spec = host.newTabSpec("tab2");
    spec.setContent(new Intent(this, Arcade_Activity.class));
    spec.setIndicator("Arcade");
    host.addTab(spec);

    spec = host.newTabSpec("tab3");
    spec.setContent(new Intent(this, Sport_Activity.class));
    spec.setIndicator("Sports");
    host.addTab(spec);

    spec = host.newTabSpec("tab4");
    spec.setContent(new Intent(this, Cards_Activity.class));
    spec.setIndicator("Top Games");
    host.addTab(spec);

    spec = host.newTabSpec("tab5");
    spec.setContent(new Intent(this, Racing_Activity.class));
    spec.setIndicator("Racing");
    host.addTab(spec);

    spec = host.newTabSpec("tab6");
    spec.setContent(new Intent(this, GameOfTheWeek.class));
    spec.setIndicator("Game Of\nThe Week");
    host.addTab(spec);

    spec = host.newTabSpec("tab7");
    spec.setContent(new Intent(this, Puzzle_Activity.class));
    spec.setIndicator("Puzzle");
    host.addTab(spec);
    currentTabposition= getTabHost().getCurrentTab();
    Log.d("chagecurrenttab", String.valueOf(getTabHost().getCurrentTab()));}

点击标签即可更改标签。但是当我想使用

更改选项卡时
host.setCurrentTab(tab position)

来自一个方法。它总是显示

void android.widget.TabHost.setCurrentTab(int) 在空对象引用上”

虽然我已经初始化了 tabhost

host = (TabHost) findViewById(android.R.id.tabhost);

详细错误如下。

03-06 11:53:07.717 19772-19772/com.javatechig.gridviewexample W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TabHost.setCurrentTab(int)' on a null object reference
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.javatechig.gridviewexample.Picture.GameRelated.GameItemListActivity.setTabContent(GameItemListActivity.java:159)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.javatechig.gridviewexample.Picture.GameRelated.Arcade_Activity$2.onSwipeRight(Arcade_Activity.java:118)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.javatechig.gridviewexample.Picture.SwipeListener$GestureListener.onFling(SwipeListener.java:46)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.GestureDetector.onTouchEvent(GestureDetector.java:610)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.javatechig.gridviewexample.Picture.SwipeListener.onTouch(SwipeListener.java:24)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.View.dispatchTouchEvent(View.java:8832)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2569)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2239)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2610)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1779)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.app.Activity.dispatchTouchEvent(Activity.java:2853)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2571)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.727 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
03-06 11:53:07.737 19772-19772/com.javatechig.gridviewexample W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2610)

请给我一个解决方案。任何解决方案将不胜感激..提前感谢

【问题讨论】:

  • Spec是TabSpec,不是封闭类,所以不需要初始化。

标签: android nullpointerexception android-tabhost swipe gesture


【解决方案1】:

除了“TabActivity 在 API 级别 13 中已弃用”和“应用程序应使用 Fragments 而不是 TabActivity”这一事实。 - Android Documentation

就个人而言,我认为您不应该使用findViewById,因为已经有一种方法可以获取 TabHost。

public TabHost getTabHost()

返回 Activity 用来托管其选项卡的 TabHost。

但是,如果您看到该链接的“类概述”部分,它会显示一个示例 XML 布局和您需要使用的适当 XML id。

您在代码中调用的位置也不清楚

host.setCurrentTab

因为如果host 对您问题中的代码为空,那么host.setup() 将引发错误。

【讨论】:

    【解决方案2】:

    可能是因为您使用的是android.R,但也可能不是,请仅使用R。 只需替换此行

    host = (TabHost) findViewById(android.R.id.tabhost);
    

    host = (TabHost) findViewById(R.id.tabhost);
    

    替换

    <TabHost android:id="@+id/tabhost"
    

    <TabHost android:id="@android:id/tabhost"
    

    【讨论】:

    • 如果我更改它,它会显示 ' Caused by: java.lang.RuntimeException: Your content must have a TabHost its id attribute is 'android.R.id.tabhost''
    • 尝试清理你的项目一次..
    • @FaisalMirza 查看我更新的答案并尝试 OR 案例...让您的主机初始化保持原样。
    • 我从一开始就给了id这样的:)
    • @FaisalMirza 嗨,你解决了吗?
    猜你喜欢
    • 2018-08-18
    • 2020-10-02
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多