Android 툴바 센터 제목 및 사용자 정의 글꼴 제목을 빈 값으로 설정하고 setCustomView사용자 정의

툴바 제목에 사용자 정의 글꼴을 사용하고 툴바의 중앙에 배치하는 올바른 방법을 찾으려고합니다 (클라이언트 요구 사항).

현재 나는 좋은 오래된 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.