如何在默认主题(Theme.Holo.Light)中将ActionBar中心的标题alignment
我search了很多,但无法find一种方法,我怎么能设置标题在ActionBar中心,而不是左alignment。 我使用下面的代码来设置中心的标题:
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.
任何其他解决scheme..任何帮助将不胜感激。
您可以创build自定义布局并将其应用于actionBar。
为此,请遵循以下2个简单步骤:
-
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>
它可以像你想要的那样复杂。 试试看!
编辑:
要设置background
,可以使用容器布局中的属性android:background
(在这种情况下为LinearLayout)。 您可能需要将布局高度android:layout_height
为match_parent
而不是wrap_content
。
此外,您还可以添加一个LOGO / ICON 。 为此,只需在布局中添加一个ImageView ,然后将布局方向属性android:orientation
为horizontal(或者简单地使用RelativeLayout并自己pipe理)。
要dynamic更改上述自定义操作栏的标题,请执行以下操作:
TextView title=(TextView)findViewById(getResources().getIdentifier("action_bar_title", "id", getPackageName())); title.setText("Your Text Here");
没有自定义视图似乎没有办法做到这一点。 你可以得到标题视图:
View decor = getWindow().getDecorView(); TextView title = (TextView) decor.findViewById(getResources().getIdentifier("action_bar_title", "id", "android"));
但改变gravity
或layout_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);
在支持Lollipop更新的支持库类上签出新的工具栏,您可以通过在布局中添加工具栏来devise操作栏
将这些项目添加到您的应用主题中
<item name="android:windowNoTitle">true</item> <item name="windowActionBar">false</item>
在布局中创build您的工具栏,并将您的文本视图包含在工具栏的中心devise中
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/acbarcolor"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/app_name" android:textColor="#ffffff" android:textStyle="bold" /> </RelativeLayout> </android.support.v7.widget.Toolbar>
添加您的行动栏作为工具栏
toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
请确保你需要像这样在你的资源文件中包含工具栏
<?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>
这实际上起作用:
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;
您必须根据您的要求定义custom_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>
我认为通过定位视图上的行动吧,你会达到你想要的。当操作栏的布局设置为与父母匹配时,它不匹配全宽,这就是为什么我以编程方式做到了我成功的地方。通过设置宽度(它的作品像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()方法:
public int getWidth() { DisplayMetrics dm = new DisplayMetrics(); mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm); return dm.widthPixels; }
Java代码:写在onCreate()
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setCustomView(R.layout.action_bar);
并为您自定义视图,只需使用FrameLayout,东方peasy!
android.support.v7.widget.Toolbar是另一种select
<?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>
我知道我的答案是不准时,但这是纯粹的代码没有xml
需要。
这是供Activity
使用的
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); }
这是用于Fragment
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); }
我有同样的问题,并且由于在工具栏中自动添加了“主页”button,我的文本没有完全input。
我固定它肮脏的方式,但在我的情况下运作良好。 我只是在我的TextView的右边添加了一个边距来补偿左边的主页button。 这是我的工具栏布局:
<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>
您可以通过包装标题和级别右边的填充来为工具栏强制使用默认的左侧填充。 比把工具栏的父母的背景颜色和那个被包装标题剪下来的部分颜色相同(我的例子中是白色的):
<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>