getSupportActionBar返回null [英] getSupportActionBar returns null

查看:99
本文介绍了getSupportActionBar返回null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用ActionBarSherlock库中的旧设备使用操作栏。在我的应用程序运行Android(4.2-真实设备)。但是,当我试图在其中跑的Andr​​oid 2.3.4我的旧的Galaxy Tab打开崩溃。这是我发现的的logcat

什么

这里是一般活动

的code

  TextView的文本;
    @覆盖
    保护无效的onCreate(包savedInstanceState){
        // TODO自动生成方法存根

        super.onCreate(savedInstanceState);

        的setContentView(R.layout.activity_general);

        / *初始UI * /

        initialUI();

        / *读取文件* /
        串生= readRawTextFile(这一点,R.raw.information);

        / ** /
        MarkdownProcessor ​​markDownPro =新MarkdownProcessor();

        / ** /
        字符串getMarkDown = markDownPro.markdown(生);

        / ** /
        CharSequence的CS = Html.fromHtml(getMarkDown);

        / ** /
        text.setText(CS);

    }

    私人无效initialUI(){
        文=(TextView的)findViewById(R.id.text);
    }

    / ** /

    公共静态字符串readRawTextFile(上下文CTX,INT渣油){
        InputStream中的InputStream = ctx.getResources()openRawResource(渣油)。
        InputStreamReader的inputreader =新的InputStreamReader(InputStream的);
        的BufferedReader buffreader =新的BufferedReader(inputreader);
        串线;
        StringBuilder的文本=新的StringBuilder();

        尝试 {
          而((行= buffreader.readLine())!= NULL){
            text.append(线);
            text.append('\ N');
          }
        }
        赶上(IOException异常E){
          返回null;
        }
        返回text.toString();
      }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        // TODO自动生成方法存根
        MenuInflater充气= getSupportMenuInflater();

        inflater.inflate(R.menu.general,菜单);

        getSupportActionBar()setBackgroundDrawable(新ColorDrawable(Color.parseColor(#003f84)))。

        返回true;
    }
}
 

GeneralActivity数82

  getSupportActionBar()setBackgroundDrawable(新ColorDrawable(Color.parseColor(#003f84)))。
 

下面的一些清单文件中的数据。

 <使用-SDK
        安卓的minSdkVersion =10
        机器人:targetSdkVersion =17/>

<应用
        机器人:allowBackup =真
        机器人:图标=@可绘制/ ic_launcher
        机器人:标签=@字符串/ APP_NAME
        机器人:主题=@风格/ Theme.Sherlock.Light.DarkActionBar>
 

现在,另一个奇怪的是,如果它的运行在Android 4.2是不显示的颜色,我描述了通过

  getSupportActionBar()setBackgroundDrawable(新ColorDrawable(Color.parseColor(#003f84)))。
 

另外一件事我必须要提到,我得到 NullPointerException异常下面的类定义我在 tabactivity 设置页。我还有一个类从列表视图的数据显示,在该类ABS工作的罚款。正如,我使用的标签导航Android.Here是我的标签类。 (如果你需要)

 公共类标签扩展TabActivity {
/ **第一次创建活动时调用。 * /

    公共无效的onCreate(包savedInstanceState){

        super.onCreate(savedInstanceState);

        的setContentView(R.layout.main);

        setTabs();
    }
    私人无效setTabs()
    {
        addTab(信息,R.drawable.tab_home,GeneralActivity.class);
        addTab(计划,R.drawable.tab_search,ScheduleMainActivity.class);

        addTab(文摘,R.drawable.tab_home,AbstractActivity.class);
        addTab(地图,R.drawable.tab_map,LocationMarkers.class);
    }

    私人无效addTab(字符串labelId,INT drawableId,类<> C)
    {
        TabHost tabHost = getTabHost();
        意向意图=新的意图(这一点,C);
        TabHost.TabSpec规格= tabHost.newTabSpec(标签+ labelId);

        查看tabIndicator = LayoutInflater.from(本).inflate(R.layout.tab_indicator,getTabWidget(),FALSE);
        TextView的标题=(TextView中)tabIndicator.findViewById(R.id.title);
        title.setText(labelId);
        ImageView的图标=(ImageView的)tabIndicator.findViewById(R.id.icon);
        icon.setImageResource(drawableId);

        spec.setIndicator(tabIndicator);
        spec.setContent(意向);
        tabHost.addTab(规范);
    }

}
 

下面是我的风格文件

 <资源>

    <! - 
        基本应用的主题,依赖于API级别。这个主题被替换
        通过AppBaseTheme从RES /值-VXX /上较新的设备styles.xml。
     - >
    <样式名称=AppBaseTheme父=机器人:Theme.Light>
        <! - 
            在新的API级别可以在可用主题自定义
            RES /值-VXX / styles.xml,而自定义相关
            向后兼容性可以去这里。
         - >
    < /风格>

    <! - 应用主题。 - >
    <样式名称=AppTheme父=AppBaseTheme>
        <! - 所有的定制,这不是针对特定的API级别的可以去这里。 - >
    < /风格>

< /资源>
 

解决方案

与行动标签栏:

 进口静电com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_TABS;
进口android.app.Dialog;
进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.support.v4.app.FragmentManager;
进口android.support.v4.app.FragmentPagerAdapter;
进口android.support.v4.app.FragmentStatePagerAdapter;
进口android.support.v4.app.FragmentTransaction;
进口android.support.v4.app.NavUtils;
进口android.support.v4.view.ViewPager;
进口android.support.v4.view.ViewPager.OnPageChangeListener;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.view.Window;
进口android.widget.Button;
进口android.widget.TextView;
进口com.actionbarsherlock.app.ActionBar;
进口com.actionbarsherlock.app.ActionBar.TabListener;
进口com.actionbarsherlock.app.SherlockFragment;
进口com.actionbarsherlock.app.SherlockFragmentActivity;

公共类Activitytest扩展SherlockFragmentActivity实现OnPageChangeListener,TabListener {

私人字符串变量=TestActivity:;
私人FileCache fileCache;
私人ViewPager mPager;
民营动作条AB;
私有静态最终诠释COUNT = 3;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.property_add);
    mPager =(ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(新MyAdapter(getSupportFragmentManager()));
    mPager.setOnPageChangeListener(本);
    AB = getSupportActionBar();

     如果(Utils.hasHoneycomb()){
         ab.setDisplayShowTitleEnabled(假);
         ab.setDisplayHomeAsUpEnabled(假);
         getSupportActionBar()setDisplayShowHomeEnabled(假)。
        }其他{
            ab.setDisplayShowTitleEnabled(假);
            ab.setDisplayShowHomeEnabled(假);
        }
    ab.setNavigationMode(NAVIGATION_MODE_TABS);

    ab.addTab(ab.newTab()的setText(TAB)setTabListener(本)。);
    ab.addTab(ab.newTab()的setText(选项卡1)setTabListener(本)。);
    ab.addTab(ab.newTab()的setText(TAB 2)setTabListener(本)。);

}
@覆盖
公共布尔onCreateOptionsMenu(com.actionbarsherlock.view.Menu菜单){
    // TODO自动生成方法存根
    com.actionbarsherlock.view.MenuInflater充气= getSupportMenuInflater();
    inflater.inflate(R.menu.home,菜单);
    返回super.onCreateOptionsMenu(菜单);
}

@覆盖
公共布尔onOptionsItemSelected(com.actionbarsherlock.view.MenuItem项目){
    // TODO自动生成方法存根
   开关(item.getItemId()){
   案例android.R.id.home:
       NavUtils.navigateUpFromSameTask(本);
       返回true;
   }
   返回super.onOptionsItemSelected(项目);
}
@覆盖
公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){}
@覆盖
公共无效onPageSelected(INT位置){
    getSupportActionBar()setSelectedNavigationItem(位置)。
}

@覆盖
公共无效onPageScrollStateChanged(INT状态){}

@覆盖
公共无效onTabSelected(ActionBar.Tab选项卡,FragmentTransaction英尺){
    mPager.setCurrentItem(this.getSupportActionBar()getSelectedNavigationIndex());
}
@覆盖
公共无效onTabUnselected(ActionBar.Tab选项卡,FragmentTransaction英尺){}
@覆盖
公共无效onTabReselected(ActionBar.Tab选项卡,FragmentTransaction英尺){}

公共类MyAdapter扩展FragmentPagerAdapter {
    公共MyAdapter(FragmentManager FM){
        超(FM);
    }

    @覆盖
    公众诠释getCount将(){
        返回计数;
    }

    @覆盖
    公共片段的getItem(INT位置){
        片f =新的片段();
        开关(位置){
        情况下0:
            F = Add1FragmentActivity.newInstance(位置);
            打破;
        情况1:
            F = Add2FragmentActivity.newInstance(位置);
            打破;
        案例2:
            F = Add3FragmentActivity.newInstance(位置);
            打破;
        默认:
            AppLog.logString(TAG +默认);
            抛出新抛出:IllegalArgumentException(没有这么多的片段:+位置);
        }
        返回F;
    }
}
}



公共类utils的{
私人的Utils(){};
公共静态布尔hasFroyo(){
    //可以使用静态常量决赛的Froyo一样,在以后的版本中声明
    //操作系统,因为它们都是内联在编译时。这是保证行为。
    返回Build.VERSION.SDK_INT> = Build.VERSION_ codeS.FROYO;
}

公共静态布尔hasGingerbread(){
    返回Build.VERSION.SDK_INT> = Build.VERSION_ codeS.GINGERBREAD;
}

公共静态布尔hasHoneycomb(){
    返回Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB;
}

公共静态布尔hasHoneycombMR1(){
    返回Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB_MR1;
}

公共静态布尔hasJellyBean(){
    返回Build.VERSION.SDK_INT> = Build.VERSION_ codeS.JELLY_BEAN;
}
 

}

I'm trying to use the ActionBarSherlock library for using Action Bar in older devices. My application run on Android(4.2-Real device). But, when I tried it to open in my older galaxy tab which ran on Android 2.3.4 it crashes. This is what I found from logcat

and here is the code of General Activity

    TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_general);

        /*initial UI*/

        initialUI();

        /*Read file*/
        String raw=readRawTextFile(this, R.raw.information);

        /**/
        MarkdownProcessor markDownPro = new MarkdownProcessor();

        /**/
        String getMarkDown = markDownPro.markdown(raw);

        /**/
        CharSequence cs = Html.fromHtml(getMarkDown);

        /**/
        text.setText(cs);

    }

    private void initialUI(){
        text = (TextView)findViewById(R.id.text);
    }

    /**/

    public static String readRawTextFile(Context ctx, int resId) {
        InputStream inputStream=ctx.getResources().openRawResource(resId);
        InputStreamReader inputreader=new InputStreamReader(inputStream);
        BufferedReader buffreader=new BufferedReader(inputreader);
        String line;
        StringBuilder text=new StringBuilder();

        try {
          while ((line=buffreader.readLine())!=null) {
            text.append(line);
            text.append('\n');
          }
        }
        catch (IOException e) {
          return null;
        }
        return text.toString();
      }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        MenuInflater inflater = getSupportMenuInflater();

        inflater.inflate(R.menu.general, menu);

        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#003f84")));

        return true;
    }
}

GeneralActivity number 82 is

 getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#003f84")));

Here some of data of manifest file

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Sherlock.Light.DarkActionBar" >

Now, Another weird this is if it's run on android 4.2 it don't show the color as I describe by

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#003f84")));

Another thing I need to mention, I am getting NullPointerException below classes I defined tab inside tabactivity. I have another class to show data from a listview, in that class ABS working fine. As, I am using tab navigation in Android.Here is my Tab class. (If you need that)

public class Tabs extends TabActivity {
/** Called when the activity is first created. */

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        setTabs() ;
    }
    private void setTabs()
    {
        addTab("Info", R.drawable.tab_home, GeneralActivity.class);
        addTab("Program", R.drawable.tab_search, ScheduleMainActivity.class);

        addTab("Abstracts", R.drawable.tab_home,AbstractActivity.class);
        addTab("Map", R.drawable.tab_map,LocationMarkers.class);
    }

    private void addTab(String labelId, int drawableId, Class<?> c)
    {
        TabHost tabHost = getTabHost();
        Intent intent = new Intent(this, c);
        TabHost.TabSpec spec = tabHost.newTabSpec("tab" + labelId); 

        View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false);
        TextView title = (TextView) tabIndicator.findViewById(R.id.title);
        title.setText(labelId);
        ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon);
        icon.setImageResource(drawableId);

        spec.setIndicator(tabIndicator);
        spec.setContent(intent);
        tabHost.addTab(spec);
    }

}

Here is my style file

<resources>

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

</resources>

解决方案

Action bar with tab:

import static com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_TABS;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.TabListener;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.app.SherlockFragmentActivity;

public class Activitytest extends SherlockFragmentActivity implements OnPageChangeListener, TabListener {

private String TAG="TestActivity: ";
private FileCache fileCache;
private ViewPager mPager;
private ActionBar ab;
private static final int COUNT = 3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.property_add);
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
    mPager.setOnPageChangeListener(this);
    ab = getSupportActionBar();

     if (Utils.hasHoneycomb()) {
         ab.setDisplayShowTitleEnabled(false);
         ab.setDisplayHomeAsUpEnabled(false);
         getSupportActionBar().setDisplayShowHomeEnabled(false);
        }else{
            ab.setDisplayShowTitleEnabled(false);
            ab.setDisplayShowHomeEnabled(false);
        }
    ab.setNavigationMode(NAVIGATION_MODE_TABS);

    ab.addTab(ab.newTab().setText("TAB").setTabListener(this));
    ab.addTab(ab.newTab().setText("TAB 1").setTabListener(this));
    ab.addTab(ab.newTab().setText("TAB 2").setTabListener(this));

}       
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    // TODO Auto-generated method stub
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.home, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
    // TODO Auto-generated method stub
   switch (item.getItemId()) {
   case android.R.id.home:
       NavUtils.navigateUpFromSameTask(this);
       return true;
   }
   return super.onOptionsItemSelected(item);
}
@Override
public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}
@Override
public void onPageSelected(int position) {
    getSupportActionBar().setSelectedNavigationItem(position);
}

@Override
public void onPageScrollStateChanged(int state) {}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    mPager.setCurrentItem(this.getSupportActionBar().getSelectedNavigationIndex()); 
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {}

public class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return COUNT;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment f = new Fragment();
        switch (position) {
        case 0:
            f = Add1FragmentActivity.newInstance(position);
            break;
        case 1:
            f = Add2FragmentActivity.newInstance(position);
            break;
        case 2:
            f = Add3FragmentActivity.newInstance(position);
            break;
        default:
            AppLog.logString(TAG+"Default");
            throw new IllegalArgumentException("not this many fragments: " + position);
        }
        return f;
    }
}
}



public class Utils {
private Utils() {};
public static boolean hasFroyo() {
    // Can use static final constants like FROYO, declared in later versions
    // of the OS since they are inlined at compile time. This is guaranteed behavior.
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO;
}

public static boolean hasGingerbread() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD;
}

public static boolean hasHoneycomb() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
}

public static boolean hasHoneycombMR1() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1;
}

public static boolean hasJellyBean() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
}

}

这篇关于getSupportActionBar返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆