具有错误的可滑动视图的Android选项卡布局

时间:2014-01-29 06:50:43

标签: android nullpointerexception android-actionbar

我正在创建具有可滑动视图的Android标签布局,但我收到了一些错误。我不知道如何解决这些错误。

代码 -

@SuppressLint("NewApi")
public class Types extends FragmentActivity implements ActionBar.TabListener{

    ImageView left, right;
    Intent objIntent;
    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private ActionBar actionBar;
    private String[] tabs = { "type1", "type2", "type3", "type4", "type5", "type6", "type7", "type8" };

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.types);
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

        for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
      }

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    protected void onPause() {
        super.onPause();
        objIntent = new Intent(Types.this, PlayAudio.class);
        stopService(objIntent);
    }

    @Override 
    public void onBackPressed() {
        super.onBackPressed();
        objIntent = new Intent(Types.this, PlayAudio.class);
        stopService(objIntent); 
        startActivity(new Intent (Types.this, MainActivity.class));  
        finish();
    } 

    @Override 
    public void onResume()
    {
        super.onResume();
        objIntent = new Intent(Types.this, PlayAudio.class);
        startService(objIntent);
    }

}

的logcat -

01-29 01:45:36.094: E/AndroidRuntime(1191): Caused by: java.lang.NullPointerException
01-29 01:45:36.094: E/AndroidRuntime(1191): at com.info.abc.Types.onCreate(Types.java:38)
01-29 01:45:36.094: E/AndroidRuntime(1191): at android.app.Activity.performCreate(Activity.java:5243)
01-29 01:45:36.094: E/AndroidRuntime(1191): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-29 01:45:36.094: E/AndroidRuntime(1191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
01-29 01:45:36.094: E/AndroidRuntime(1191):     ... 11 more

这是第38行:

actionBar.setHomeButtonEnabled(false);

导入文件 -

import android.support.v7.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

2 个答案:

答案 0 :(得分:1)

如果您的活动没有title bar,则方法getActionBar()可以返回null。

您有两种方法可以解决此问题:

  1. getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

  2. 之前添加setContentView
  3. Manifest指定支持ActionBar的主题

  4. 同时确保您定位的是正确的Android版本,例如<uses-sdk android:minSdkVersion="11" />

    进一步的信息转到此Link.

答案 1 :(得分:0)

通过查看您的代码,我假设您正在使用较低版本(低于API 11)设备测试应用程序。这就是为什么您获得异常。ActionBar在API级别11中引入。现在为了使它工作,你有以下两种方式,

1.将您的最小SDK值更改为API 11.

2.从API级别7使用支持android-support-v7-appcompat的{​​{1}}库。

  • 要使用ActionBar,您的活动应该延长ActionBarCompat
  • 将您的活动主题更改为ActionBarActivity

有关详细信息,请访问以下网站: http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html