getSupportActionBar返回null [英] getSupportActionBar returns null
问题描述
我试图用ActionBarSherlock库中的旧设备使用操作栏。在我的应用程序运行Android(4.2-真实设备)
。但是,当我试图在其中跑的Android 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屋!