私はたくさん検索しましたが、方法を見つけることができません、左揃えではなくActionBarの中心にタイトルを設定するにはどうすればよいですか?以下のコードを使用してタイトルを中央に設定しました:
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に適用できます。
そのためには、次の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
を設定するには、コンテナレイアウト(その場合はLinearLayout)でプロパティAndroid:background
を使用できます。レイアウトの高さAndroid:layout_height
をmatch_parent
ではなくwrap_content
に設定する必要がある場合があります。
さらに、LOGO/ICONを追加することもできます。これを行うには、レイアウト内にImageViewを追加し、レイアウトの向きプロパティAndroid:orientation
をhorizontalに設定します(または単にRelativeLayoutを使用して自分で管理します)。
上記のカスタムアクションバーのタイトルを動的に変更するには、次の操作を行います。
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アップデートのサポートライブラリクラスの新しいツールバーをご覧ください。レイアウトにツールバーを追加してアクションバーを設計できます
これらのアイテムをアプリのテーマに追加します
<item name="Android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
レイアウトにツールバーを作成し、テキストビューを中央に含めてツールバーを設計します
<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>
私の答えは予定通りではありませんが、これは純粋に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);
}
ツールバーを使用している場合は、追加のみ
Android:layout_gravity="center_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>
これは実際に機能します:
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>
Javaコード:onCreate()でこれを記述しますgetSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setCustomView(R.layout.action_bar);
カスタムビューの場合は、FrameLayoutを使用してください。
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>
アクションバーにビューを配置すると、あなたが望むものに到達すると思います。レイアウトバーが親に一致するように設定されている場合のアクションバーのレイアウトでは、全幅と一致しないため、成功した場所でプログラムで実行しました。 = "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;
}
タイトルを折り返すことでツールバーを強制し、タイトルのデフォルトの左のパディングがある右のパディングを水平にすることができます。背景色をツールバーの親に配置するよりも、タイトルを折り返すことで切り取られる部分は同じ色(私の例では白)です:
<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>
ソリューションは次のことに基づいています。
それは何をするためのものか:
初めてツールバーが#setTitleを実行するとき、AppCompatTextViewを作成し、それを使用してタイトルテキストを表示します。
appCompatTextViewが作成されると、ツールバー(ViewGroupとして)は、#addViewメソッドを使用して独自の階層に追加します。
また、解決策を見つけようとすると、textviewのレイアウト幅が「wrap_content」に設定されていることに気づいたので、「match_parent」にし、textalignmentを「center」に割り当てることにしました。
MyToolbar.kt、無関係なもの(コンストラクター/インポート)をスキップ:
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)
}
}
「副作用」の可能性-これは「字幕」にも適用されます
同じ問題が発生し、ツールバーに「ホーム」ボタンが自動的に追加されたため、テキストが正確に入力されませんでした。
汚い方法で修正しましたが、私の場合はうまくいきます。 TextViewの右側にマージンを追加して、左側のホームボタンを補正しました。ツールバーのレイアウトは次のとおりです。
<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>