Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在默认主题(theme.Holo.Light)中对齐操作栏中心的标题_Android_Android Actionbar_Alignment_Center_Title - Fatal编程技术网

Android 如何在默认主题(theme.Holo.Light)中对齐操作栏中心的标题

Android 如何在默认主题(theme.Holo.Light)中对齐操作栏中心的标题,android,android-actionbar,alignment,center,title,Android,Android Actionbar,Alignment,Center,Title,我搜索了很多,但找不到一个方法,我怎么能把标题设置在动作栏的中心,而不是左对齐。我使用以下代码将标题设置在中间: ViewGroup decorView= (ViewGroup) this.getWindow().getDecorView(); LinearLayout root= (LinearLayout) decorView.getChildAt(0); FrameLayout titleContainer= (FrameLayout) root.getChildAt(0); TextVi

我搜索了很多,但找不到一个方法,我怎么能把标题设置在动作栏的中心,而不是左对齐。我使用以下代码将标题设置在中间:

ViewGroup decorView= (ViewGroup) this.getWindow().getDecorView();
LinearLayout root= (LinearLayout) decorView.getChildAt(0);
FrameLayout titleContainer= (FrameLayout) root.getChildAt(0);
TextView title= (TextView) titleContainer.getChildAt(0);
title.setGravity(Gravity.CENTER);
但它给出了如下错误:

ClassCastException : com.android.internal.widget.ActionBarView can not 
be cast to android.widget.TextView.

任何其他解决方案。任何帮助都将不胜感激。

您可以创建自定义布局并将其应用于actionBar

为此,请执行以下两个简单步骤:

  • Java代码

    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.actionbar);
    
  • 其中
    R.layout.actionbar
    是以下布局

  • XML

    <?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="wrap_content"
        android:layout_gravity="center"
        android:orientation="vertical">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/action_bar_title"
        android:text="YOUR ACTIVITY TITLE"
        android:textColor="#ffffff"
        android:textSize="24sp" />
    </LinearLayout>
    

    如果没有自定义视图,似乎无法做到这一点。您可以获得标题视图:

    View decor = getWindow().getDecorView();
    TextView title = (TextView) decor.findViewById(getResources().getIdentifier("action_bar_title", "id", "android"));
    
    但是改变
    gravity
    layout\u gravity
    不会产生影响。
    ActionBarView
    中的问题是,它自行布局其子级,因此更改其子级的布局参数也不会产生影响。 要查看此异常,请执行以下代码:

    ViewGroup actionBar = (ViewGroup) decor.findViewById(getResources().getIdentifier("action_bar", "id", "android"));
    View v = actionBar.getChildAt(0);
    ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    p.gravity= Gravity.CENTER;
    v.setLayoutParams(p);
    v.setBackgroundColor(Color.BLACK);
    

    我认为,通过在操作栏上定位视图,您将达到所需的效果。在操作栏的布局上,当布局参数设置为与父级匹配时,它与全宽不匹配 这就是为什么我成功地通过编程实现了它。通过设置宽度(它的工作原理类似于layout_weight=“value”),我们可以在任何需要的地方设置视图:

        actionBar = getSupportActionBar(); 
        actionBar.setDisplayShowCustomEnabled(true); 
    
        LayoutInflater ll = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout linearLayout = (LinearLayout) ll.inflate(R.layout.custom_actionbar, null);
        //inner layout within above linear layout
        LinearLayout inner = (LinearLayout) linearLayout.findViewById(R.id.inner_linear_ractionbar);
        inner.setMinimumWidth(getWidth() * 2 / 10);
        // we will set our textview to center and display there some text
        TextView t = (TextView) linearLayout.findViewById(R.id.center_text);
        t.setWidth(getWidth() * 6 / 10);
    
    
        Button b = (Button) linearLayout.findViewById(R.id.edit_button);
        b.setWidth(getWidth() *3/ 20);
    
        ImageButton imageButton = (ImageButton) linearLayout.findViewById(R.id.action_bar_delete_item);
        imageButton.setMinimumWidth(deviceUtils.getWidth() / 20);
    
    下面是getWidth()方法:


    查看棒棒糖更新中支持库类上的新工具栏。通过在布局中添加工具栏,您可以设计actionbar

    在应用程序主题中添加这些项目

     <item name="android:windowNoTitle">true</item>
     <item name="windowActionBar">false</item>
    
    请确保您需要像这样在资源文件中包含工具栏

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <include
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            layout="@layout/toolbar" />
    
        <android.support.v4.widget.DrawerLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <!-- Framelayout to display Fragments -->
            <FrameLayout
                android:id="@+id/frame_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <include
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    layout="@layout/homepageinc" />
    
            </FrameLayout>
    
            <fragment
                android:id="@+id/fragment1"
                android:layout_gravity="start"
                android:name="com.shouldeye.homepages.HomeFragment"
                android:layout_width="250dp"
                android:layout_height="match_parent" />
    
        </android.support.v4.widget.DrawerLayout>
    
    </LinearLayout>
    
    
    
    Java代码: 在onCreate()中写入此内容
    getSupportActionBar().setDisplayShowCustomEnabled(true)
    
    getSupportActionBar().setCustomView(R.layout.action\u bar)

    对于自定义视图,只需使用FrameLayout,east peasy
    android.support.v7.widget.Toolbar是另一个选项

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="@string/app_name"
            android:textColor="@color/black"
            android:id="@+id/textView" />
    </FrameLayout>
    
    
    
    这实际上是可行的:

     getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
     getActionBar().setCustomView(R.layout.custom_actionbar);
      ActionBar.LayoutParams p = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            p.gravity = Gravity.CENTER;
    
    您必须根据您的要求定义自定义的\u actionbar.xml布局,例如:

    <?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="50dp"
        android:background="#2e2e2e"
        android:orientation="vertical"
        android:gravity="center"
        android:layout_gravity="center">
    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/top_banner"
            android:layout_gravity="center"
            />
    </LinearLayout>
    

    我也遇到了同样的问题,由于工具栏中自动添加了“主页”按钮,我的文本没有准确输入

    我用肮脏的方法修复了它,但在我的情况下效果很好。我只是在文本视图的右侧添加了一个边距,以补偿左侧的home按钮。以下是我的工具栏布局:

    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:elevation="1dp"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_collapseMode="pin"
        android:gravity="center"
        android:background="@color/mainBackgroundColor"
        android:fitsSystemWindows="true" >
    
        <com.lunabee.common.utils.LunabeeShadowTextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="?attr/actionBarSize"
            android:gravity="center"
            style="@style/navigation.toolbar.title" />
    
    </android.support.v7.widget.Toolbar>
    

    我知道我的答案不准时,但这纯粹是代码no
    xml
    所需。
    这用于
    活动

    public void setTitle(String title){
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        TextView textView = new TextView(this);
        textView.setText(title);
        textView.setTextSize(20);
        textView.setTypeface(null, Typeface.BOLD);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        textView.setGravity(Gravity.CENTER);
        textView.setTextColor(getResources().getColor(R.color.white));
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(textView);
    }
    

    这用于
    片段

    public void setTitle(String title){
        ((AppCompatActivity)getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
        ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        TextView textView = new TextView(getActivity());
        textView.setText(title);
        textView.setTextSize(20);
        textView.setTypeface(null, Typeface.BOLD);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        textView.setGravity(Gravity.CENTER);
        textView.setTextColor(getResources().getColor(R.color.white));
        ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        ((AppCompatActivity)getActivity()).getSupportActionBar().setCustomView(textView);
    }
    

    您可以通过包装标题和级别右侧填充强制工具栏,其中标题具有默认的左侧填充。然后将背景色添加到工具栏的父级,这样,通过包装标题剪切的部分将使用相同的颜色(在我的示例中为白色):


    如果使用工具栏,只需添加

    android:layout\u gravity=“center\u horizontal”

    在工具栏下面,就像这个片段一样

     <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay">
    
            <TextView
                android:id="@+id/tvTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"    //Important 
                android:textColor="@color/whitecolor"
                android:textSize="20sp"
                android:textStyle="bold" />
        </android.support.v7.widget.Toolbar>
    
    </android.support.design.widget.AppBarLayout>
    

    解决方案基于以下几点:

    • 您需要使用自己的类来扩展工具栏(support.v7.widget.Toolbar)
    • 您需要覆盖一个方法工具栏#addView
    它做什么:

    当工具栏第一次执行#setTitle时,它会创建AppCompatTextView并使用它显示标题文本

    创建AppCompatTextView时,工具栏(作为ViewGroup)会使用#addView方法将其添加到自己的层次结构中

    此外,在试图找到解决方案时,我注意到textview的布局宽度设置为“wrap\u content”,因此我决定将其设置为“match\u parent”,并将textalignment指定为“center”

    MyToolbar.kt,跳过不相关的内容(构造函数/导入):


    可能的“副作用”-这也适用于“副标题”

    经过两天的网络浏览后,这就是我在科特林想到的。在我的应用程序上测试并运行

      private fun setupActionBar() {
        supportActionBar?.apply {
            displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM
            displayOptions = ActionBar.DISPLAY_SHOW_TITLE
            setDisplayShowCustomEnabled(true)
            title = ""
    
    
            val titleTextView = AppCompatTextView(this@MainActivity)
            titleTextView.text = getText(R.string.app_name)
            titleTextView.setSingleLine()
            titleTextView.textSize = 24f
            titleTextView.setTextColor(ContextCompat.getColor(this@MainActivity, R.color.appWhite))
    
            val layoutParams = ActionBar.LayoutParams(
                ActionBar.LayoutParams.WRAP_CONTENT,
                ActionBar.LayoutParams.WRAP_CONTENT
            )
            layoutParams.gravity = Gravity.CENTER
            setCustomView(titleTextView, layoutParams)
    
            setBackgroundDrawable(
                ColorDrawable(
                    ContextCompat.getColor(
                        this@MainActivity,
                        R.color.appDarkBlue
                    )
                )
            )
    
        }
    }
    

    它工作完美,但它使用自定义显示..我使用的是Theme.Holo.Light..所以所有带有图像、背景色和Backbutton的徽标都被删除了,只有简单的白色标题栏显示在ActionBar的中心。有没有办法在我当前的主题中显示它?谢谢。不,你的第二个答案不起作用。它说框架布局无法解析为键入。它工作完美,但它使用自定义显示。我使用的是Theme.Holo.Light。所以所有带有图像的徽标,背景色和Backbutton被删除,只有简单的白色标题栏显示在ActionBar的中心。我想在默认主题中使用此功能。我不想在ActionBar中使用它。DISPLAY_SHOW_CUSTOM..因此它不起作用。请确保使用
    getSupportActionBar()。setDisplayOptions(android.support.v7.app.ActionBar.DISPLAY_SHOW_CUSTOM)
    如果您使用的是support
    ActionBar
    。如果不使用,则仅使用
    ActionBar.DISPLAY_SHOW_CUSTOM
    可能会显示红色编译错误。ActionBar应用主题的空指针异常是DarkActionBara您是否尝试在android上模拟iOS设计?因为您确实不应该:)希望它能帮助你们,若你们正在使用工具栏:)超级简单的实现和非常容易定制。美好的
    public void setTitle(String title){
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        TextView textView = new TextView(this);
        textView.setText(title);
        textView.setTextSize(20);
        textView.setTypeface(null, Typeface.BOLD);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        textView.setGravity(Gravity.CENTER);
        textView.setTextColor(getResources().getColor(R.color.white));
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(textView);
    }
    
    public void setTitle(String title){
        ((AppCompatActivity)getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
        ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        TextView textView = new TextView(getActivity());
        textView.setText(title);
        textView.setTextSize(20);
        textView.setTypeface(null, Typeface.BOLD);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        textView.setGravity(Gravity.CENTER);
        textView.setTextColor(getResources().getColor(R.color.white));
        ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        ((AppCompatActivity)getActivity()).getSupportActionBar().setCustomView(textView);
    }
    
    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">
    
            <android.support.v7.widget.Toolbar
               android:id="@+id/toolbar"
               android:layout_width="wrap_content"
               android:layout_height="56dp"
               android:layout_gravity="center_horizontal"
               android:paddingEnd="15dp"
               android:paddingRight="15dp"
               android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
               app:titleTextColor="@color/black"/>
    
    </android.support.design.widget.AppBarLayout>
    
     <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay">
    
            <TextView
                android:id="@+id/tvTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"    //Important 
                android:textColor="@color/whitecolor"
                android:textSize="20sp"
                android:textStyle="bold" />
        </android.support.v7.widget.Toolbar>
    
    </android.support.design.widget.AppBarLayout>
    
    class MyToolbar : Toolbar {
    
      override fun addView(child: View, params: ViewGroup.LayoutParams) {
        if (child is TextView) {
            params.width = ViewGroup.LayoutParams.MATCH_PARENT
            child.textAlignment= View.TEXT_ALIGNMENT_CENTER
        }
        super.addView(child, params)
      }
    }
    
      private fun setupActionBar() {
        supportActionBar?.apply {
            displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM
            displayOptions = ActionBar.DISPLAY_SHOW_TITLE
            setDisplayShowCustomEnabled(true)
            title = ""
    
    
            val titleTextView = AppCompatTextView(this@MainActivity)
            titleTextView.text = getText(R.string.app_name)
            titleTextView.setSingleLine()
            titleTextView.textSize = 24f
            titleTextView.setTextColor(ContextCompat.getColor(this@MainActivity, R.color.appWhite))
    
            val layoutParams = ActionBar.LayoutParams(
                ActionBar.LayoutParams.WRAP_CONTENT,
                ActionBar.LayoutParams.WRAP_CONTENT
            )
            layoutParams.gravity = Gravity.CENTER
            setCustomView(titleTextView, layoutParams)
    
            setBackgroundDrawable(
                ColorDrawable(
                    ContextCompat.getColor(
                        this@MainActivity,
                        R.color.appDarkBlue
                    )
                )
            )
    
        }
    }