ActionBar 제목에서 사용자 정의 글꼴을 설정하는 방법은 무엇입니까?


257

자산 폴더에 글꼴을 사용하여 ActionBar 제목 텍스트 (탭 텍스트가 아닌)에 사용자 정의 글꼴을 설정하는 방법은 무엇입니까? android : logo 옵션을 사용하고 싶지 않습니다.

답변:


211

이것이 완전히 지원되지는 않는다는 데 동의하지만 여기에 내가 한 일이 있습니다. 작업 표시 줄에 대한 사용자 정의보기를 사용할 수 있습니다 (아이콘과 작업 항목 사이에 표시됨). 사용자 정의보기를 사용하고 있으며 기본 제목이 비활성화되어 있습니다. 내 모든 활동은 단일 활동에서 상속되며 onCreate 에이 코드가 있습니다.

this.getActionBar().setDisplayShowCustomEnabled(true);
this.getActionBar().setDisplayShowTitleEnabled(false);

LayoutInflater inflator = LayoutInflater.from(this);
View v = inflator.inflate(R.layout.titleview, null);

//if you need to customize anything else about the text, do it here.
//I'm using a custom TextView with a custom font in my layout xml so all I need to do is set title
((TextView)v.findViewById(R.id.title)).setText(this.getTitle());

//assign the view to the actionbar
this.getActionBar().setCustomView(v);

그리고 내 레이아웃 xml (위 코드의 R.layout.titleview)은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

<com.your.package.CustomTextView
        android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:textSize="20dp"
            android:maxLines="1"
            android:ellipsize="end"
            android:text="" />
</RelativeLayout>

1
제목에는 문제가 없지만 제목과 탭을 원하는 경우 제목과 같이 왼쪽에없는 탭의 오른쪽에 사용자 지정보기를 배치합니다. 실제 제목을 변경할 수 있기를 바랍니다.
draksia

2
훌륭한 솔루션. XML로 글꼴을 지정할 수있는 사용자 정의 텍스트 뷰 클래스가 필요한 경우 내 것을 시도하십시오! github.com/tom-dignan/nifty- 매우 쉽습니다.
토마스 디냥

이 코드는 onCreate ()에 있어야합니까? 나는 ... 내 활동 동적으로 외부를 설정해야합니다
IgorGanapolsky

글꼴을 동적으로 변경해야합니까? 또는 글꼴이 이미 사용자 정의되면 제목을 변경하려고합니까?
Sam Dozor 2016 년

2
이것은 작동하지만 많은 작업을 수행하는 방법입니다. 플러스 : 아이콘을 클릭 할 때 강조 표시되는 것과 같이 표준 타이틀의 일부 기능이 손실됩니다 ... 사용자 정의 타이틀은 글꼴을 변경하기 위해서만 표준 타이틀 레이아웃을 다시 만드는 데 사용되지 않습니다 ...
Zordid

422

사용자 정의 TypefaceSpan클래스를 사용하여이 작업을 수행 할 수 있습니다 . customView액션 뷰 확장과 같은 다른 액션 바 요소를 사용할 때 깨지지 않기 때문에 위에 표시된 접근 방식 보다 우수합니다 .

이러한 클래스를 사용하면 다음과 같이 보일 것입니다.

SpannableString s = new SpannableString("My Title");
s.setSpan(new TypefaceSpan(this, "MyTypeface.otf"), 0, s.length(),
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Update the action bar title with the TypefaceSpan instance
ActionBar actionBar = getActionBar();
actionBar.setTitle(s);

사용자 정의 TypefaceSpan클래스에는 활동 컨텍스트와 assets/fonts디렉토리 의 서체 이름이 전달 됩니다. 파일을로드하고 새 Typeface인스턴스를 메모리에 캐시합니다 . 전체 구현 TypefaceSpan은 놀랍도록 간단합니다.

/**
 * Style a {@link Spannable} with a custom {@link Typeface}.
 * 
 * @author Tristan Waddington
 */
public class TypefaceSpan extends MetricAffectingSpan {
      /** An <code>LruCache</code> for previously loaded typefaces. */
    private static LruCache<String, Typeface> sTypefaceCache =
            new LruCache<String, Typeface>(12);

    private Typeface mTypeface;

    /**
     * Load the {@link Typeface} and apply to a {@link Spannable}.
     */
    public TypefaceSpan(Context context, String typefaceName) {
        mTypeface = sTypefaceCache.get(typefaceName);

        if (mTypeface == null) {
            mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                    .getAssets(), String.format("fonts/%s", typefaceName));

            // Cache the loaded Typeface
            sTypefaceCache.put(typefaceName, mTypeface);
        }
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}

위의 클래스를 프로젝트에 복사하고 위와 같이 액티비티의 onCreate방법으로 구현하십시오 .


20
좋은 대답입니다. 좋은 점은 서체 요소를 캐시하는 방법도 보여 주었다는 것입니다.
Anand Sainath

6
이것은 우수하다. 하나의 문제- textAllCaps기본 TextView 에서 속성이 true로 설정되면 (예 : 테마를 통해) 사용자 정의 글꼴이 나타나지 않습니다. 이 기법을 작업 표시 줄 탭 항목에 적용 할 때 문제가되었습니다.
James

4
이 클래스 구현에서는 글꼴 파일을에 넣었다고 가정합니다 assets/fonts/. 하위 폴더가 아닌 자산 아래에 .ttf / .otf 파일을 던지면 그에 따라 다음 코드 줄을 수정해야합니다 String.format("fonts/%s", typefaceName). 나는 그것을 알아 내려고 노력하는 좋은 10 분을 잃었다. 당신이하지 않으면 얻을 것이다java.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt

1
앱을 시작하는 순간 기본 제목 스타일이 표시되고 약 1 초 후에 사용자 정의 스타일이 나타납니다. 나쁜 UI ...
공감

2
이것은 큰 대답이며 톤을 나에게 도움이되었습니다. 내가 추가 할 한 가지 개선 사항은 캐싱 메커니즘을 TypefaceSpan 외부의 자체 클래스로 옮기는 것입니다. 범위가없는 서체를 사용하는 다른 상황에 부딪 쳤으므로 해당 상황에서도 캐시를 활용할 수있었습니다.
Justin

150
int titleId = getResources().getIdentifier("action_bar_title", "id",
            "android");
    TextView yourTextView = (TextView) findViewById(titleId);
    yourTextView.setTextColor(getResources().getColor(R.color.black));
    yourTextView.setTypeface(face);

2
이것은 질문에 대한 선호 답변이어야합니다. "action_bar_subtitle"과도 잘 작동합니다! 감사!
Zordid

20
최신 버전의 Android 개발자가 리소스 ID를 "action_bar_title"에서 다른 이름으로 변경하면 아무 것도 작동하지 않습니다. 그것이 그렇게 투표되지 않은 이유입니다.
Diogo Bento

6
appcompat를 위해 api> 3.0에서 작동하지만 2.x에서는 작동하지 않습니다.
Aman Singhal

1
이것은 글꼴 및 모든 것을 변경합니다. 그러나 다음 활동으로 이동하여 다시 누르면 글꼴이 되돌려집니다. ActionBar 속성과 관련이 있다고 생각합니다.
Pranav Mahajan

11
@ Digit : "Holo Theme"에는 훌륭했지만 "Material Theme"에는 적합하지 않습니다 (android L). titleId를 찾았지만 textview가 null입니다.이 문제를 해결하는 방법이 있습니까? 감사!
Michael D.

34

Android Support Library v26 + Android Studio 3.0 부터이 프로세스는 간단합니다!

툴바 제목의 글꼴을 변경하려면 다음 단계를 따르십시오.

  1. 다운로드 가능한 글꼴을 읽고 목록에서 글꼴을 선택 하거나 ( 내 권장 사항 ) XML의 글꼴에res > font 따라 사용자 정의 글꼴을로드하십시오.
  2. 에 다음 res > values > styles을 붙여 넣습니다 ( 상상력을 여기에 사용하십시오! )

    <style name="TitleBarTextAppearance" parent="android:TextAppearance">
        <item name="android:fontFamily">@font/your_desired_font</item>
        <item name="android:textSize">23sp</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">@android:color/white</item>
    </style>
  3. app:titleTextAppearance="@style/TextAppearance.TabsFont"아래와 같이 툴바 속성에 새 줄을 삽입하십시오

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:titleTextAppearance="@style/TitleBarTextAppearance"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>
  4. Custom Actionbar Title 글꼴 스타일링을 즐기십시오!


2
툴바에 좋습니다. 새로운 활동에 기본 앱 바가있는 경우와 같이 앱 전체 에서이 작업을 수행 할 수있는 방법이 있습니까?
Jordan H

14

서예 라이브러리하자 당신은 또한 작업 표시 줄에 적용 할 응용 프로그램 테마를 통해 사용자 정의 글꼴을 설정합니다.

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>

<style name="AppTheme.Widget"/>

<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
   <item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>

서예를 활성화하는 데 필요한 것은 활동 컨텍스트에 첨부하는 것입니다.

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

기본 사용자 정의 속성은 fontPath이지만 Application 클래스에서로 초기화하여 경로에 대한 사용자 정의 속성을 제공 할 수 있습니다 CalligraphyConfig.Builder. 사용을 android:fontFamily권장하지 않습니다.


이 솔루션에 대한 최소 API (16)
사미 Eltamawy

프로젝트의 빌드 파일에 따라 minSdk 7이지만 minSdk 18 프로젝트에서이를 사용하고 있으며 더 이상 확인하지 않았습니다. 문제가되는 방법은 무엇입니까?
thoutbeckers

최소 API 7입니다. 예제는 API16입니다. 그것은 APPCOMPAT-V7 + 지원
Chris.Jenkins

11

추악한 해킹이지만 action_bar_title이 숨겨져 있기 때문에 다음과 같이 할 수 있습니다.

    try {
        Integer titleId = (Integer) Class.forName("com.android.internal.R$id")
                .getField("action_bar_title").get(null);
        TextView title = (TextView) getWindow().findViewById(titleId);
        // check for null and manipulate the title as see fit
    } catch (Exception e) {
        Log.e(TAG, "Failed to obtain action bar title reference");
    }

이 코드는 GINGERBREAD 이후 장치 용이지만 작업 표시 줄 Sherlock과 함께 작동하도록 쉽게 확장 할 수 있습니다.

PS @pjv 의견을 기반으로 액션 바 제목 ID를 찾는 더 좋은 방법이 있습니다

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");

4
나는 stackoverflow.com/questions/10779037/… 에서 dtmilano의 대답을 선호합니다 . 비슷하지만 조금 더 미래의 증거입니다.
pjv

1
@pjv-동의했습니다. 덜 "해키"인 것 같습니다. 답변을 수정했습니다.
Bostone

1
따라서 질문은 사용자 정의 글꼴에 관한 것입니다. 이것은 기본 작업 표시 줄의 텍스트보기를 얻는 방법 입니다.
AlikElzin-kilaka

@kilaka-아이디어는 텍스트보기 설정을 얻는 경우 사용자 정의 글꼴이 사소한 것입니다. 이 게시물은 오래된 게시물입니다. 트위 딩턴의 답변이 훨씬 선호됩니다.
Bostone

8

다음 코드는 모든 버전에서 작동합니다. 진저 브레드가있는 장치와 JellyBean 장치에서 이것을 확인했습니다.

 private void actionBarIdForAll()
    {
        int titleId = 0;

        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
        {
            titleId = getResources().getIdentifier("action_bar_title", "id", "android");
        }
        else
        {
          // This is the id is from your app's generated R class when ActionBarActivity is used for SupportActionBar

            titleId = R.id.action_bar_title;
        }

        if(titleId>0)
        {
            // Do whatever you want ? It will work for all the versions.

            // 1. Customize your fonts
            // 2. Infact, customize your whole title TextView

            TextView titleView = (TextView)findViewById(titleId);
            titleView.setText("RedoApp");
            titleView.setTextColor(Color.CYAN);
        }
    }

이것은 ActionBar와 AppCompat ActionBar 모두에서 저에게 효과적입니다. 그러나 후자는 onCreate () 후에 제목보기를 찾으려고 할 때만 작동하므로 예를 들어 onPostCreate ()에 배치하면 트릭이 수행됩니다.
Harri

8

지원 라이브러리에서 새 도구 모음을 사용하여 작업 표시 줄을 자신의 것으로 디자인하거나 아래 코드를 사용하십시오.

Textview를 팽창시키는 것은 좋은 옵션이 아닙니다.

Typeface font2 = Typeface.createFromAsset(getAssets(), "fonts/<your font in assets folder>");   
SpannableStringBuilder SS = new SpannableStringBuilder("MY Actionbar Tittle");
SS.setSpan (new CustomTypefaceSpan("", font2), 0, SS.length(),Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
actionBar.setTitle(ss);

수업 아래에 복사

public class CustomTypefaceSpan extends TypefaceSpan{

    private final Typeface newType;

    public CustomTypefaceSpan(String family, Typeface type) {
        super(family);
        newType = type;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        applyCustomTypeFace(ds, newType);
    }

    @Override
    public void updateMeasureState(TextPaint paint) {
        applyCustomTypeFace(paint, newType);
    }

    private static void applyCustomTypeFace(Paint paint, Typeface tf) {
        int oldStyle;
        Typeface old = paint.getTypeface();
        if (old == null) {
            oldStyle = 0;
        } else {
            oldStyle = old.getStyle();
        }

        int fake = oldStyle & ~tf.getStyle();
        if ((fake & Typeface.BOLD) != 0) {
            paint.setFakeBoldText(true);
        }

        if ((fake & Typeface.ITALIC) != 0) {
            paint.setTextSkewX(-0.25f);
        }

        paint.setTypeface(tf);
    }

}

7
    ActionBar actionBar = getSupportActionBar();
    TextView tv = new TextView(getApplicationContext());
    Typeface typeface = ResourcesCompat.getFont(this, R.font.monotype_corsiva);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.MATCH_PARENT, // Width of TextView
            RelativeLayout.LayoutParams.WRAP_CONTENT); // Height of TextView
    tv.setLayoutParams(lp);
    tv.setText("Your Text"); // ActionBar title text
    tv.setTextSize(25);
    tv.setTextColor(Color.WHITE);
    tv.setTypeface(typeface, typeface.ITALIC);
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    actionBar.setCustomView(tv);

위대한 이 완벽하게 작동하고 내가 중심에이 응용 프로그램 막대를 얻을 수있는 방법?
Prasath

단지 대체 .. 매력처럼 작동 typeface.ITALIC으로하는 Typeface.ITALIC정적 멤버 경고가 없습니다
자인

3

전체 액티비티에서 모든 TextViews로 서체를 설정하려면 다음과 같이 사용할 수 있습니다.

public static void setTypefaceToAll(Activity activity)
{
    View view = activity.findViewById(android.R.id.content).getRootView();
    setTypefaceToAll(view);
}

public static void setTypefaceToAll(View view)
{
    if (view instanceof ViewGroup)
    {
        ViewGroup g = (ViewGroup) view;
        int count = g.getChildCount();
        for (int i = 0; i < count; i++)
            setTypefaceToAll(g.getChildAt(i));
    }
    else if (view instanceof TextView)
    {
        TextView tv = (TextView) view;
        setTypeface(tv);
    }
}

public static void setTypeface(TextView tv)
{
    TypefaceCache.setFont(tv, TypefaceCache.FONT_KOODAK);
}

그리고 TypefaceCache :

import java.util.TreeMap;

import android.graphics.Typeface;
import android.widget.TextView;

public class TypefaceCache {

    //Font names from asset:
    public static final String FONT_ROBOTO_REGULAR = "fonts/Roboto-Regular.ttf";
    public static final String FONT_KOODAK = "fonts/Koodak.ttf";

    private static TreeMap<String, Typeface> fontCache = new TreeMap<String, Typeface>();

    public static Typeface getFont(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if(tf == null) {
            try {
                tf = Typeface.createFromAsset(MyApplication.getAppContext().getAssets(), fontName);
            }
            catch (Exception e) {
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

    public static void setFont(TextView tv, String fontName)
    {
        tv.setTypeface(getFont(fontName));
    }
}

3

방금 onCreate () 함수에서 다음을 수행했습니다.

TypefaceSpan typefaceSpan = new TypefaceSpan("font_to_be_used");
SpannableString str = new SpannableString("toolbar_text");
str.setSpan(typefaceSpan,0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(str);

지원 라이브러리를 사용하고 있습니다. 사용하지 않는 경우 getSupportActionBar () 대신 getActionBar ()로 전환해야한다고 생각합니다.

Android Studio 3에서는 https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html 지침에 따라 사용자 정의 글꼴을 추가 한 다음 " font_to_be_used "


1

@ Sam_D의 답변에 추가하려면이 작업을 수행해야합니다.

this.setTitle("my title!");
((TextView)v.findViewById(R.id.title)).setText(this.getTitle());
TextView title = ((TextView)v.findViewById(R.id.title));
title.setEllipsize(TextUtils.TruncateAt.MARQUEE);
title.setMarqueeRepeatLimit(1);
// in order to start strolling, it has to be focusable and focused
title.setFocusable(true);
title.setSingleLine(true);
title.setFocusableInTouchMode(true);
title.requestFocus();

v.findViewById (R.id.title))을 두 번 참조하는 것은 과도한 것처럼 보이지만 이것이 내가 할 수있는 유일한 방법입니다.


1

정답을 업데이트합니다.

첫 번째 : 사용자 정의보기를 사용하고 있기 때문에 제목을 false로 설정하십시오.

    actionBar.setDisplayShowTitleEnabled(false);

둘째 : titleview.xml 생성

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@android:color/transparent" >

    <TextView
       android:id="@+id/title"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_marginLeft="10dp"
       android:textSize="20dp"
       android:maxLines="1"
       android:ellipsize="end"
       android:text="" />

</RelativeLayout>

마지막으로 :

//font file must be in the phone db so you have to create download file code
//check the code on the bottom part of the download file code.

   TypeFace font = Typeface.createFromFile("/storage/emulated/0/Android/data/"   
    + BuildConfig.APPLICATION_ID + "/files/" + "font name" + ".ttf");

    if(font != null) {
        LayoutInflater inflator = LayoutInflater.from(this);
        View v = inflator.inflate(R.layout.titleview, null);
        TextView titleTv = ((TextView) v.findViewById(R.id.title));
        titleTv.setText(title);
        titleTv.setTypeface(font);
        actionBar.setCustomView(v);
    } else {
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle("  " + title); // Need to add a title
    }

글꼴 파일 다운로드 : 파일을 cloudinary에 저장하고 있으므로 다운로드 할 수있는 링크가 있기 때문에.

/**downloadFile*/
public void downloadFile(){
    String DownloadUrl = //url here
    File file = new File("/storage/emulated/0/Android/data/" + BuildConfig.APPLICATION_ID + "/files/");
    File[] list = file.listFiles();
    if(list == null || list.length <= 0) {
        BroadcastReceiver onComplete = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                try{
                    showContentFragment(false);
                } catch (Exception e){
                }
            }
        };

        registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DownloadUrl));
        request.setVisibleInDownloadsUi(false);
        request.setDestinationInExternalFilesDir(this, null, ModelManager.getInstance().getCurrentApp().getRegular_font_name() + ".ttf");
        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        manager.enqueue(request);
    } else {
        for (File files : list) {
            if (!files.getName().equals("font_name" + ".ttf")) {
                BroadcastReceiver onComplete = new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        try{
                            showContentFragment(false);
                        } catch (Exception e){
                        }
                    }
                };

                registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DownloadUrl));
                request.setVisibleInDownloadsUi(false);
                request.setDestinationInExternalFilesDir(this, null, "font_name" + ".ttf");
                DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                manager.enqueue(request);
            } else {
                showContentFragment(false);
                break;
            }
        }
    }
}

1

사용자 정의 텍스트 뷰가 필요하지 않습니다!

먼저, 자바 코드에서 툴바의 제목을 비활성화하십시오 : getSupportActionBar (). setDisplayShowTitleEnabled (false);

그런 다음 툴바 안에 TextView를 추가하십시오.

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:textSize="18sp"
        android:fontFamily="@font/roboto" />

    </android.support.v7.widget.Toolbar>

최신 탐색 UI 제트 팩 라이브러리에서는 작동하지 않습니다
Ali Asheer

1

이것을 사용해보십시오

TextView headerText= new TextView(getApplicationContext());
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
headerText.setLayoutParams(lp);
headerText.setText("Welcome!");
headerText.setTextSize(20);
headerText.setTextColor(Color.parseColor("#FFFFFF"));
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/wesfy_regular.ttf");
headerText.setTypeface(tf);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(headerText);

0

이것을 달성하기 위해서는 반사를 사용해야합니다

final int titleId = activity.getResources().getIdentifier("action_bar_title", "id", "android");

    final TextView title;
    if (activity.findViewById(titleId) != null) {
        title = (TextView) activity.findViewById(titleId);
        title.setTextColor(Color.BLACK);
        title.setTextColor(configs().getColor(ColorKey.GENERAL_TEXT));
        title.setTypeface(configs().getTypeface());
    } else {
        try {
            Field f = bar.getClass().getDeclaredField("mTitleTextView");
            f.setAccessible(true);
            title = (TextView) f.get(bar);
            title.setTextColor(Color.BLACK);
            title.setTypeface(configs().getTypeface());
        } catch (NoSuchFieldException e) {
        } catch (IllegalAccessException e) {
        }
    }

-1

이 시도

public void findAndSetFont(){
        getActionBar().setTitle("SOME TEST TEXT");
        scanForTextViewWithText(this,"SOME TEST TEXT",new SearchTextViewInterface(){

            @Override
            public void found(TextView title) {

            } 
        });
    }

public static void scanForTextViewWithText(Activity activity,String searchText, SearchTextViewInterface searchTextViewInterface){
    if(activity == null|| searchText == null || searchTextViewInterface == null)
        return;
    View view = activity.findViewById(android.R.id.content).getRootView();
    searchForTextViewWithTitle(view, searchText, searchTextViewInterface);
}

private static void searchForTextViewWithTitle(View view, String searchText, SearchTextViewInterface searchTextViewInterface)
{
    if (view instanceof ViewGroup)
    {
        ViewGroup g = (ViewGroup) view;
        int count = g.getChildCount();
        for (int i = 0; i < count; i++)
            searchForTextViewWithTitle(g.getChildAt(i), searchText, searchTextViewInterface);
    }
    else if (view instanceof TextView)
    {
        TextView textView = (TextView) view;
        if(textView.getText().toString().equals(searchText))
            if(searchTextViewInterface!=null)
                searchTextViewInterface.found(textView);
    }
}
public interface SearchTextViewInterface {
    void found(TextView title);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.