Android - Как изменить нижнюю навигационную строку текста
Я создал навигацию нижнего бара на моей странице Android. Но теперь я хочу применить пользовательское семейство шрифтов в нижних навигационных текстах.
Это нижний навигационный код в .xml
файле:
<android.support.design.widget.BottomNavigationView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/bottomNavView_Bar"
android:background="@drawable/white_grey_border_top"
app:menu="@menu/bottom_navigation_menu">
</android.support.design.widget.BottomNavigationView>
Кроме того, код в bottom_navigation_menu.xml
:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
>
<item
android:id="@+id/ic_newsfeed"
android:icon="@drawable/ic_menu_camera"
android:title="NEWSFEED"
/>
<item
android:id="@+id/ic_explorer"
android:icon="@drawable/ic_home_black_24dp"
android:title="EXPLORER"
/>
<item
android:id="@+id/ic_notify"
android:icon="@drawable/ic_notifications_black_24dp"
android:title="NOTIFY"
/>
<item
android:id="@+id/ic_more"
android:icon="@drawable/ic_dashboard_black_24dp"
android:title="MORE"
/>
</menu>
Помощь была бы оценена.
Заранее спасибо!
Ответы
Ответ 1
добавьте файл шрифтов в папку res/font/для объединения шрифтов в качестве ресурсов
затем
Вы можете изменить его, используя ресурсы стиля.
В вашем файле styles.xml:
<style name="Widget.BottomNavigationView"
parent="Widget.Design.BottomNavigationView">
<item name="fontFamily">@font/your_font</item>
</style>
Затем примените его в качестве темы на ваш взгляд:
<android.support.design.widget.BottomNavigationView
...
android:theme="@style/Widget.BottomNavigationView"
/>
Только что проверил мое приложение, оно работает нормально.
ссылка:https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html#fonts-in-code
Ответ 2
В вашем макете:
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:itemTextAppearanceActive="@style/BottomNavigationViewTextStyle"
app:itemTextAppearanceInactive="@style/BottomNavigationViewTextStyle"
... />
В ваших styles.xml:
<style name="BottomNavigationViewTextStyle">
...
<item name="android:fontFamily">@font/whatever_font</item>
...
</style>
Ответ 3
Это может быть сделано путем переопределения OnLayout метод класса BottomNavigationView затем с помощью расширенного тега. Этот подход также отображает все названия меню и отключает смещение.
public final class ExtendedBottomNavigationView extends BottomNavigationView{
private final Context context;
private Typeface fontFace = null;
public ExtendedBottomNavigationView(Context context, AttributeSet attrs){
super(context, attrs);
this.context = context;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom){
super.onLayout(changed, left, top, right, bottom);
final ViewGroup bottomMenu = (ViewGroup)getChildAt(0);
final int bottomMenuChildCount = bottomMenu.getChildCount();
BottomNavigationItemView item;
View itemTitle;
Field shiftingMode;
if(fontFace == null){
fontFace = Typeface.createFromAsset(context.getAssets(), context.getString(R.string.VazirBold));
}
try {
//if you want to disable shiftingMode:
//shiftingMode is a private member variable so you have to get access to it like this:
shiftingMode = bottomMenu.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(bottomMenu, false);
shiftingMode.setAccessible(false);
} catch (NoSuchFieldException e){
e.printStackTrace();
} catch (IllegalAccessException e){e.printStackTrace();}
for(int i=0; i<bottomMenuChildCount; i++){
item = (BottomNavigationItemView)bottomMenu.getChildAt(i);
//this shows all titles of items
item.setChecked(true);
//every BottomNavigationItemView has two children, first is an itemIcon and second is an itemTitle
itemTitle = item.getChildAt(1);
//every itemTitle has two children, first is a smallLabel and second is a largeLabel. these two are type of AppCompatTextView
((TextView)((BaselineLayout) itemTitle).getChildAt(0)).setTypeface(fontFace, Typeface.BOLD);
((TextView)((BaselineLayout) itemTitle).getChildAt(1)).setTypeface(fontFace, Typeface.BOLD);
}
}
}
Затем используйте его следующим образом:
<your.package.name.ExtendedBottomNavigationView android:id="@id/bottomMenu" style="@style/bottomMenu"/>
Ответ 4
если у вас есть CustomFont в папке с активами и вы хотите установить в своей нижней навигации, используйте этот код
public class Font extends AppCompatActivity {
public static void persian_iran_font(final Context context, final View v) {
try {
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
persian_iran_font(context, child);
}
} else if (v instanceof TextView) {
((TextView) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "teshrinarmedium.otf"));
}
} catch (Exception e) {
}
}
}
И затем используйте Font Class в вашей MainActivity Like This
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
Font.persian_iran_font(getApplicationContext(), navigation);
Удачи
Ответ 5
В https://material.io/develop/android/components/bottom-navigation-view/ просто установите элемент fontFamily для стиля TextAppearance.MaterialComponents.Caption и все это будет работать. com.google.android.material.bottomnavigation.BottomNavigationView будет использовать это по умолчанию.
Просто знайте другие компоненты, которые полагаются на TextAppearance.MaterialComponents.Caption, также будут изменены, но это может быть желательно.
<style name="TextAppearance.MaterialComponents.Caption" parent="AppMaterialComponentsTheme">
<item name="fontFamily">@font/example</item>
</style>
Ответ 6
public void setNavigationTypeface() {
final Typeface avenirHeavy = Typeface.createFromAsset(this.getAssets(), "font2/Avenir-Heavy.ttf"); //replace it with your own font
ViewGroup navigationGroup = (ViewGroup) bottomNavView.getChildAt(0);
for (int i = 0; i < navigationGroup.getChildCount(); i++) {
ViewGroup navUnit = (ViewGroup) navigationGroup.getChildAt(i);
for (int j = 0; j < navUnit.getChildCount(); j++) {
View navUnitChild = navUnit.getChildAt(j);
if (navUnitChild instanceof BaselineLayout) {
BaselineLayout baselineLayout = (BaselineLayout) navUnitChild;
for (int k = 0; k < baselineLayout.getChildCount(); k++) {
View baselineChild = baselineLayout.getChildAt(k);
if (baselineChild instanceof TextView) {
TextView textView = (TextView) baselineChild;
textView.setTypeface(avenirHeavy);
}
}
}
}
}
}
Ответ 7
Если вы хотите динамически изменять выбор текста при выборе, вы можете сделать bottomNav.itemTextAppearanceActive = R.style.yourstyle
Ответ 8
Kotlin Код пользовательского BottomNavigationView для установки пользовательского шрифта:
1. Сохраните шрифт в каталог ресурсов вашего проекта студии Android. Здесь я использовал свой шрифт "SolaimanLipi_20-04-07.ttf"
2. Скопируйте ниже код kotlin и вставьте его в свой проект студии Android.
class FontBottomNavigationView : BottomNavigationView {
constructor(context: Context) : super(context) {
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
}
private var fontFace: Typeface? = null
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
val bottomMenu = getChildAt(0) as ViewGroup
val bottomMenuChildCount: Int = bottomMenu.childCount
var item: BottomNavigationItemView? = null
var itemTitle: View? = null
var shiftingMode: Field? = null
if (fontFace == null){
fontFace = Typeface.createFromAsset(context.assets, "SolaimanLipi_20-04-07.ttf") // font from assets directory
}
try {
shiftingMode = bottomMenu.javaClass.getDeclaredField("mShiftingMode")
shiftingMode.isAccessible = true
shiftingMode.setBoolean(bottomMenu, false)
shiftingMode.isAccessible = false
} catch (e: Exception){
e.printStackTrace()
}
for (i in 0..bottomMenuChildCount){
try {
item = bottomMenu.getChildAt(i) as BottomNavigationItemView
itemTitle = item.getChildAt(1)
((itemTitle as BaselineLayout).getChildAt(0) as AppCompatTextView).typeface = fontFace
((itemTitle as BaselineLayout).getChildAt(1) as AppCompatTextView).typeface = fontFace
} catch (e: Exception){
e.printStackTrace()
}
}
}}
3.Используйте файл XML, как показано ниже:
<com.example.projectname.FontBottomNavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:menu="@menu/bottom_nav_menu" />
@Arash помог ответ: