我正在关注教程https://www.youtube.com/watch?v=VVahIc8yENk并且我收到了错误
java.lang.NullPointerException:尝试调用虚方法' void android.app.ActionBar.setNavigationMode(INT)'在null对象上 参考
我使用Android Studio编写此程序,我尝试从API 11到21,但没有一个能够正常工作。
public class Tabtest extends FragmentActivity implements ActionBar.TabListener {
ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_test);
actionBar=getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab tab1=actionBar.newTab();
tab1.setText("tab1");
tab1.setTabListener(this);
ActionBar.Tab tab2=actionBar.newTab();
tab2.setText("tab2");
tab2.setTabListener(this);
ActionBar.Tab tab3=actionBar.newTab();
tab3.setText("tab3");
tab3.setTabListener(this);
ActionBar.Tab tab4=actionBar.newTab();
tab4.setText("tab4");
tab4.setTabListener(this);
actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3);
actionBar.addTab(tab4);
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
Log.d("VIVZ", "onTabReselected at "+" position "+tab.getPosition()+" name "+tab.getText());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
Log.d("VIVZ", "onTabReselected at "+" position "+tab.getPosition()+" name "+tab.getText());
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
Log.d("VIVZ", "onTabReselected at "+" position "+tab.getPosition()+" name "+tab.getText());
}
}
答案 0 :(得分:11)
我在youtube中关注Vivz示例,但是当该方法被弃用时,我必须找到另一种方法。不要向操作栏添加标签,请尝试:
修改适配器:
public class CollectionPagerAdapter extends FragmentStatePagerAdapter {
private String[] titles = {"Item 1", "Item 2", "Item 3" };
public CollectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch(i){
case 0:
return new FragmentA();
case 1:
return new FragmentB();
case 2:
return new FragmentC();
}
return null;
}
@Override
public int getCount() {
return titles.length;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
在您要实施标签的活动中尝试
public class Tabtest extends ActionBarActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_test);
ViewPager pager = (ViewPager) findViewById(R.id.your_view_pager);
pager.setAdapter(new CollectionPagerAdapter(getSupportFragmentManager()));
PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
tabs.setViewPager(pager);
}
现在,如果您希望为选项卡名称下的移动指示器设置Google Play商店等标签的样式,并在用户滚动时移动,则编译此库
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
并修改您的viewpager布局文件,如下所示:
<LinearLayout
//obviously add width and height and other necessery stuff
android:orientation="vertical">
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="48dip" />
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
然后你会有所期望的效果。
希望它有所帮助!!!
答案 1 :(得分:4)
您可以使用&#34; PagerSlidingTabStrip &#34;替换&#34; setNavigationMode &#34;
here a tutorial 这里是Github的example
答案 2 :(得分:1)
最后我找到了答案。 1你的android sdk
<uses-sdk android:minSdkVersion="11" />
必须高于11。 第2 你的主题必须有像
这样的动作栏android:theme="Theme.AppCompat"
第三 请勿在您的活动中使用此代码
requestWindowFeature(Window.FEATURE_NO_TITLE);
第四
而不是import android.support.v4.app.ActionBar
在您的活动中使用import android.support.v7.app.ActionBar
第五
将此actionBar=getActionBar();
更改为actionbar=getSupportActionBar();
答案 3 :(得分:0)
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setNavigationMode(int)' on a null object reference
您的主题显然是没有操作栏的主题。由于您未使用appcompat-v7
,请确保使用支持本机操作栏的主题,例如Theme.Holo
系列之一。
如果您尝试使用appcompat-v7
,则需要继承ActionBarActivity
,并且需要使用getSupportActionBar()
,而不是getActionBar()
。
另请注意,自Android 5.0起,操作栏标签已弃用。您应该考虑另一个标签解决方案,例如ViewPager
和PagerTabStrip
的组合。