GVKun编程网logo

如何在android中的actionbar文本顶部添加图标(安卓actionbar添加按钮)

17

本文的目的是介绍如何在android中的actionbar文本顶部添加图标的详细情况,特别关注安卓actionbar添加按钮的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面

本文的目的是介绍如何在android中的actionbar文本顶部添加图标的详细情况,特别关注安卓actionbar添加按钮的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解如何在android中的actionbar文本顶部添加图标的机会,同时也不会遗漏关于ActionBar / Tabs中的Android自定义主题、ActionBar菜单项的动态可绘制图标? (Android,ActionBarSherlock)、Android 1.6中的ActionBar、Android 4.3中的自定义ActionBar文本外观的知识。

本文目录一览:

如何在android中的actionbar文本顶部添加图标(安卓actionbar添加按钮)

如何在android中的actionbar文本顶部添加图标(安卓actionbar添加按钮)

我是 android的新手.我正在尝试实现一个有三个选项卡的操作栏,每个选项卡包含一个图标和tab的名称.我成功地在每个选项卡上放置图标和文本,但遗憾的是图标出现在文本的左侧(选项卡的名称)在选项卡中.我希望文本顶部的地方图标而不是左侧.请找到我的代码片段,请帮我找到解决方案.提前致谢,

private void setActionBar()

         {               

           ActionBar bar = getActionBar();

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setdisplayShowHomeEnabled(false);
    bar.setdisplayShowTitleEnabled(false);

    ActionBar.Tab tabA = bar.newTab().setText("TabA");
        tabA.setIcon(R.drawable.iconA);

            ActionBar.Tab tabB = bar.newTab().setText("TabB");
    tabB.setIcon(R.drawable.iconB);

    ActionBar.Tab tabC = bar.newTab().setText("TabC");
            tabC.setIcon(R.drawable.iconC);
        }

解决方法

您可以使用自定义视图来定义要显示选项卡的方式.

>定义自定义布局,其中您的文本上方有图像
>在您的活动中,为视图充气并设置图像和文本的值
>为选项卡设置自定义视图

这是一个粗略的例子:

定制布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

<ImageView
    android:id="@+id/tabIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:paddingTop="2dp" />

<TextView
    android:id="@+id/tabText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:textColor="#FFFFFF" />

</LinearLayout>

通货膨胀视图

View tabView = activity.getLayoutInflater().inflate(R.layout.actiobar_tab,null);
TextView tabText = (TextView) tabView.findViewById(R.id.tabText);
tabText.setText(R.String.sometext);

ImageView tabImage = (ImageView) tabView.findViewById(R.id.tabIcon);
tabImage.setimageDrawable(activity.getResources().getDrawable(R.drawable.someimage));

设置GIVEN TAB的定制视图

Tab tab = actionBar.newTab().setCustomView(tabView)

ActionBar / Tabs中的Android自定义主题

ActionBar / Tabs中的Android自定义主题

我的主题是Holo.Light.DarkActionBar

标签现在设置为白色背景,浅灰色文本 – 非常难以理解.我只想将文本更改为更深,更暗.

我搜索了样式,看看我是否可以覆盖,但我能做的就是改变背景,而不是文本.

我可以在styles.xml中执行此操作,还是必须以编程方式执行此操作?

解决方法

如果你指的是ActionBar的标签,看看是否会改变颜色:
<!-- The theme for the activity -->
<style name="TabSpecialTheme" parent="android:Theme.Holo.Light.DarkActionBar">
      <item name="@android:attr/actionBarTabTextStyle">@style/TabStyle</item>
</style>

<!-- Modify the text color -->
<style name="TabStyle" parent="android:Widget.Holo.Light.ActionBar.TabText.Inverse">
      <item name="android:textColor">#F70000</item>
</style>

当然不要忘记将活动的主题设置为清单中的@ style / TabSpecialTheme.

ActionBar菜单项的动态可绘制图标? (Android,ActionBarSherlock)

ActionBar菜单项的动态可绘制图标? (Android,ActionBarSherlock)

如何动态更新ActionBar MenuItem的图标以显示带有数字的“红色徽章”? (概念上类似于“未读消息计数”)

我在我的Android应用程序中使用ActionBarSherlock,目标是API级别10.我的应用程序用于移动数据捕获,有时用户无法立即提交新数据,但必须在手机上本地保存(例如,当连接性较差时).

每当手机本地存储“未提交”项目时,我想向用户显示一个菜单项(在操作栏中),以便他们可以点击进入UnsubmittedItems活动并手动触发上传.

理想情况下,此菜单项将包含未提交项目数量的图形表示(类似于电子邮件或短信应用程序如何显示未读邮件的数量作为徽章).目前,我只是在做:

unsubmittedMenuItem.setTitle( Integer.toString(numUnsubmitted) );

这有用,但有两个问题:我更喜欢使用Icon并将Title保持为可理解的东西(“未提交”),而且,我也希望在这里有一些自定义布局或设计,例如红圈数字背后的背景.

关于如何实现这一点的想法?到目前为止我的研究提出了两种可能

>使用为某些数字范围(例如1,2,3 …… 10)预先创建的级别列表drawable,然后使用unsubmittedMenuItem.getIcon().setLevel(numUnsubmitted)
>使用Bitmap和Canvas API完全动态地构建整个位图

这些是相似的,我将文本渲染成位图(像#1一样离线或像#2那样在飞行中)但是如果可能的话,利用ActionBar的“原生”文本渲染会很棒像在TextView中一样在它后面插入一个红色圆圈.

有没有办法为图标drawable设置自定义布局? (不是完整的actionLayout,仅用于图标?)

解决方法

有很多方法可以做到这一点:

>使用LayerDrawable并在徽标图像顶部堆叠徽章图像.>编写一个从Drawable扩展的自定义类,并手动绘制图标和徽章.>在ImageView中使用带有图标的自定义操作项视图,并使用TextView覆盖徽章.

Android 1.6中的ActionBar

Android 1.6中的ActionBar

我的应用程式中有这个来源:

@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        setTheme(getHoneycombStyle());
        ActionBar actionBar = getActionBar();
        if (actionBar != null) {
            actionBar.setCustomView(R.layout.ACTION_BAR);
        }
    }
}

它可以在Honeycomb,Android 2.1、2.2和2.3中正常工作,但是在Android 1.6中则无法工作.尽管我已经检查了SDK版本,但该应用程序返回此异常:

08-31 18:23:33.063: ERROR/AndroidRuntime(3262): Uncaught handler: thread main exiting due to uncaught exception
08-31 18:23:33.083: ERROR/AndroidRuntime(3262): java.lang.VerifyError: com.eldan.introducing.activity.IBBaseCompActivity
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at java.lang.class.newInstanceImpl(Native Method)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at java.lang.class.newInstance(Class.java:1472)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.app.Instrumentation.newActivity(Instrumentation.java:1097)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2316)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:2242)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.app.LocalActivityManager.movetoState(LocalActivityManager.java:127)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:631)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.widget.TabHost.setCurrentTab(TabHost.java:317)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:127)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:346)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.View.performClick(View.java:2344)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.View.onTouchEvent(View.java:4133)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.View.dispatchTouchEvent(View.java:3672)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:850)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superdispatchTouchEvent(PhoneWindow.java:1712)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at com.android.internal.policy.impl.PhoneWindow.superdispatchTouchEvent(PhoneWindow.java:1202)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.app.Activity.dispatchTouchEvent(Activity.java:1987)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1696)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1658)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.os.Looper.loop(Looper.java:123)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at android.app.ActivityThread.main(ActivityThread.java:4203)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at java.lang.reflect.Method.invokeNative(Native Method)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at java.lang.reflect.Method.invoke(Method.java:521)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
08-31 18:23:33.083: ERROR/AndroidRuntime(3262):     at dalvik.system.NativeStart.main(Native Method)

听起来编译器在我的onCreate方法中检测到ActionBar源,而Android 1.6不支持它.但是我不太确定如何解决这个问题.

解决方法:

您无法在加载到旧版Android VM中的代码中引用新版Android中的类或方法.

您有两个主要选择:

>将ActionBar代码隔离到一个单独的实用工具类中,并且仅当您在Honeycomb上时才使用该类,具体取决于android.os.Build. Here is a sample project演示了通过隔离在仅用于Honeycomb的HoneycombHelper类中的getActionView()调用,利用getActionView()将自定义布局放入可用于Honeycomb和更旧版本的操作栏中.
>使用ActionBarSherlock访问操作栏.它将为您提供Honeycomb上的本机操作栏,以及旧版Android上的工作方式.

Android 4.3中的自定义ActionBar文本外观

Android 4.3中的自定义ActionBar文本外观

我已使用以下代码在操作栏上自定义了应用程序标题的外观

<style name="myTheme.ActionBar.Text" parent="@android:style/TextAppearance">
    <item name="android:textColor">#ff2d2d2d</item>
    <item name="android:textSize">26sp</item>
    <item name="android:fontFamily">sans-serif-condensed</item>
    <item name="android:textAllCaps">true</item>
    <item name="android:textStyle">bold</item>
</style>

无论如何,在我测试过的大多数设备中,一切都运行良好(3个要精确)但是1,运行Android 4.3(Sony Xperia Z)的设备没有应用样式.我后来在运行4.3的模拟器上测试了它并得到了相同的结果.

有没有办法解决这个问题?

这是应用程序的完整样式

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light">

        <item name="android:actionBarStyle">@style/myTheme.ActionBar</item>
        <!-- Customize your theme here. -->
        <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
        <item name="android:buttonStyle">@style/RobotoButtonStyle</item>
        <item name="android:editTextBackground">@drawable/apptheme_edit_text_holo_dark</item>

        <item name="android:actionBarItemBackground">@drawable/nav_list_selector</item>

    </style>


    <style name="RobotoTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">sans-serif-light</item>
    </style>

    <style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
        <item name="android:fontFamily">sans-serif-light</item>
    </style>

    <style name="myTheme.ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:titleTextStyle">@style/myTheme.ActionBar.Text</item>
        <item name="android:background">@drawable/action_bar_bg</item>
        <item name="android:searchButtonText">SEARCH</item>
        <item name="android:editTextBackground">@drawable/apptheme_edit_text_holo_dark</item>

    </style>

    <style name="myTheme.ActionBar.Text" parent="@android:style/TextAppearance">
        <item name="android:textColor">#ff2d2d2d</item>
        <item name="android:textSize">26sp</item>
        <item name="android:fontFamily">sans-serif-condensed</item>
        <item name="android:textAllCaps">true</item>
        <item name="android:textStyle">bold</item>
    </style>

</resources>

解决方法

对我来说,这就像一个魅力.
让我们为动作栏创建一个自定义视图

RES /布局/ action_title_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text=""
        android:textAllCaps="true"
        android:textSize="16sp"
        android:textColor="@color/actionbar_text" />

</RelativeLayout>

在活动onCreate中设置自定义操作栏

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // set action bar custom view
    getActionBar().setdisplayShowCustomEnabled(true);
    getActionBar().setdisplayShowTitleEnabled(false);

    LayoutInflater inflator = (LayoutInflater) this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mCustomActionView = inflator.inflate(R.layout.action_title_view,null);

    // assign the view to the actionbar
    getActionBar().setCustomView(mCustomActionView);

    ...
}

现在覆盖活动的setTitle方法

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    ((TextView) mCustomActionView.findViewById(R.id.title)).setText(mTitle);
    getActionBar().setTitle("");
}

使用setTitle方法设置自定义操作栏文本.希望这可以帮助.

今天关于如何在android中的actionbar文本顶部添加图标安卓actionbar添加按钮的介绍到此结束,谢谢您的阅读,有关ActionBar / Tabs中的Android自定义主题、ActionBar菜单项的动态可绘制图标? (Android,ActionBarSherlock)、Android 1.6中的ActionBar、Android 4.3中的自定义ActionBar文本外观等更多相关知识的信息可以在本站进行查询。

本文标签: