툴바 제목에 사용자 정의 글꼴을 사용하고 툴바의 중앙에 배치하는 올바른 방법을 찾으려고합니다 (클라이언트 요구 사항).
현재 나는 좋은 오래된 ActionBar를 사용하고 있으며 제목을 빈 값으로 설정하고 setCustomView
사용자 정의 글꼴 TextView를 넣고 ActionBar.LayoutParams를 사용하여 중앙에 배치하는 데 사용했습니다.
더 좋은 방법이 있습니까? 새로운 툴바를 ActionBar로 사용합니다.
답변
Toolbar
당신이해야 할 모든 사용자 정의 제목을 사용하는 Toolbar
것은 단지 멋진 ViewGroup이므로 다음과 같이 사용자 정의 제목을 추가 할 수 있다는 것입니다.
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_top"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="@color/action_bar_bkgnd"
app:theme="@style/ToolBarTheme" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Toolbar Title"
android:layout_gravity="center"
android:id="@+id/toolbar_title" />
</android.support.v7.widget.Toolbar>
이것은 TextView
단지 일반이기 때문에 원하는 스타일을 지정할 수 있음을 의미합니다 TextView
. 따라서 활동에서 다음과 같이 제목에 액세스 할 수 있습니다.
Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
답변
툴바 제목은 스타일이 지정 가능합니다. 테마에서 사용자 정의를 수행해야합니다. 예를 들어 보겠습니다.
툴바 레이아웃 :
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
style="@style/ToolBarStyle.Event"
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="?attr/colorPrimary"
android:minHeight="@dimen/abc_action_bar_default_height_material" />
스타일 :
<style name="ToolBarStyle" parent="ToolBarStyle.Base"/>
<style name="ToolBarStyle.Base" parent="">
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>
<style name="ToolBarStyle.Event" parent="ToolBarStyle">
<item name="titleTextAppearance">@style/TextAppearance.Widget.Event.Toolbar.Title</item>
</style>
<style name="TextAppearance.Widget.Event.Toolbar.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
<!--Any text styling can be done here-->
<item name="android:textStyle">normal</item>
<item name="android:textSize">@dimen/event_title_text_size</item>
</style>
답변
이것은 @Jonik 및 @Rick Sanchez 주석으로 @ MrEngineer13 답변 을 사용하여 모든 조각을 결합하여 제목을 쉽게 중심에 맞출 수 있도록 도와줍니다!
레이아웃 TextAppearance.AppCompat.Widget.ActionBar.Title
:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
android:layout_gravity="center" />
</android.support.v7.widget.Toolbar>
올바른 순서로 달성하는 방법 :
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
setSupportActionBar(toolbar);
mTitle.setText(toolbar.getTitle());
getSupportActionBar().setDisplayShowTitleEnabled(false);
@ MrEngineer13 답변을 찬성 하는 것을 잊지 마십시오 !!!
다음은 샘플 프로젝트 ToolbarCenterTitleSample입니다.
다른 사람을 도울 수 있도록 노력하십시오.)
답변
툴바 제목 TextView에 직접 액세스 할 수 없으므로 리플렉션을 사용하여 액세스합니다.
private TextView getActionBarTextView() {
TextView titleTextView = null;
try {
Field f = mToolBar.getClass().getDeclaredField("mTitleTextView");
f.setAccessible(true);
titleTextView = (TextView) f.get(mToolBar);
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
}
return titleTextView;
}
답변
다음은 TextView
에서 인스턴스 를 찾는 제목 텍스트 종속 접근 방식 입니다 Toolbar
.
public static TextView getToolbarTitleView(ActionBarActivity activity, Toolbar toolbar){
ActionBar actionBar = activity.getSupportActionBar();
CharSequence actionbarTitle = null;
if(actionBar != null)
actionbarTitle = actionBar.getTitle();
actionbarTitle = TextUtils.isEmpty(actionbarTitle) ? toolbar.getTitle() : actionbarTitle;
if(TextUtils.isEmpty(actionbarTitle)) return null;
// can't find if title not set
for(int i= 0; i < toolbar.getChildCount(); i++){
View v = toolbar.getChildAt(i);
if(v != null && v instanceof TextView){
TextView t = (TextView) v;
CharSequence title = t.getText();
if(!TextUtils.isEmpty(title) && actionbarTitle.equals(title) && t.getId() == View.NO_ID){
//Toolbar does not assign id to views with layout params SYSTEM, hence getId() == View.NO_ID
//in same manner subtitle TextView can be obtained.
return t;
}
}
}
return null;
}
답변
다음 클래스를 정의하십시오.
public class CenteredToolbar extends Toolbar {
private TextView centeredTitleTextView;
public CenteredToolbar(Context context) {
super(context);
}
public CenteredToolbar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public CenteredToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setTitle(@StringRes int resId) {
String s = getResources().getString(resId);
setTitle(s);
}
@Override
public void setTitle(CharSequence title) {
getCenteredTitleTextView().setText(title);
}
@Override
public CharSequence getTitle() {
return getCenteredTitleTextView().getText().toString();
}
public void setTypeface(Typeface font) {
getCenteredTitleTextView().setTypeface(font);
}
private TextView getCenteredTitleTextView() {
if (centeredTitleTextView == null) {
centeredTitleTextView = new TextView(getContext());
centeredTitleTextView.setTypeface(...);
centeredTitleTextView.setSingleLine();
centeredTitleTextView.setEllipsize(TextUtils.TruncateAt.END);
centeredTitleTextView.setGravity(Gravity.CENTER);
centeredTitleTextView.setTextAppearance(getContext(), R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);
Toolbar.LayoutParams lp = new Toolbar.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER;
centeredTitleTextView.setLayoutParams(lp);
addView(centeredTitleTextView);
}
return centeredTitleTextView;
}
}
… 그리고 다음 Toolbar
과 같이 일반 대신 사용하십시오 .
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent">
<your.packagename.here.CenteredToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"
app:title="@string/reset_password_page_title"/>
<!-- Other views -->
</RelativeLayout>
여전히 Activity
표준과 마찬가지로 다음 두 줄의 코드가 필요합니다 Toolbar
.
Toolbar toolbar = (Toolbar) findViewByid(R.id.toolbar); // note that your activity doesn't need to know that it is actually a custom Toolbar
setSupportActionBar(binding.toolbar);
그게 다야! 표준 왼쪽 정렬 제목을 숨길 필요가 없으며 동일한 XML 코드를 반복해서 복제 할 필요가 없으며 CenteredToolbar
기본값 인 것처럼 사용 하십시오 Toolbar
. 에 직접 액세스 할 수 있으므로 프로그래밍 방식으로 사용자 정의 글꼴을 설정할 수도 있습니다 TextView
. 도움이 되었기를 바랍니다.
답변
아무도 이것을 언급하지 않았지만 다음과 같은 속성이 있습니다 Toolbar
.
app:titleTextColor
제목 텍스트 색상 설정
app:titleTextAppearance
제목 텍스트 모양 설정
app:titleMargin
여백 설정
그리고와 같은 다른 특정 측면 여백이 있습니다 marginStart
.