Изменение размера текста пункта меню в андроиде

Я использую простые элементы меню в панели действий, используя следующий код в основном действии:

    package com.kaasib.ftpclient;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.ActionBar;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        boolean ret;
        if(item.getItemId() == R.id.connection_manager){
            ret = true;
        }else{
            ret = super.onOptionsItemSelected(item);
        }

        return ret;
    }
}

Вот меню xml в main.xml:

    <menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/connection_manager"
        android:orderInCategory="100"
        android:showAsAction="collapseActionView"
        android:title="@string/connection_manager"
        android:textSize="2sp"
        />

</menu> 

Он работает, за исключением того, что он не вносит никаких изменений в размер текста. Прямо сейчас размер текста для пункта меню больше, а размер шрифта должен быть меньше. Так что я делаю неправильно? Разве атрибут android:textSize не должен работать? Или есть другой способ сделать это? Я считаю, что размер текста должен быть установлен из XML, а не из java, поскольку это связано с дизайном. Любое предложение?


person Hafiz    schedule 18.08.2013    source источник
comment
Вы пробовали использовать dp или px в теге android:textSize=""?   -  person Salman Khakwani    schedule 18.08.2013
comment
@SalmanKhakwani: пытался, но это не сработало   -  person Hafiz    schedule 18.08.2013


Ответы (6)


Итак, это мое решение, вы можете использовать SpannableString для извлечения текста, а затем изменить шрифт с помощью RelativeSizeSpan (если вам нужен размер текста относительно размера по умолчанию) или с помощью AbsoluteSizeSpan (если вы хотите вручную ввести размер текста ):

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    MenuInflater awesome = getMenuInflater();
    awesome.inflate(R.menu.menu_main, menu);
    for(int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
    SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
        int end = spanString.length();
    spanString.setSpan(new RelativeSizeSpan(1.5f), 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    item.setTitle(spanString);
}
    return true;
}

В этом примере размер текста пункта меню увеличивается на 50%.

person John Petrucci    schedule 04.09.2015

добавьте в XML-файл стиля, как эта нижняя строка кода, ваш собственный размер шрифта,

после этого

<style name="menu_text_style" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Menu">
    <item name="android:textSize">16sp</item>
    <item name="android:textColor">@color/tab_default_color</item>
    <item name="android:textAllCaps">false</item>
</style>

после того, как нужно добавить "menu_text_style" в свой NavigationView

        app:itemTextAppearance="@style/menu_text_style"
person Caner Yılmaz    schedule 27.12.2017

Добавьте элемент «android:actionMenuTextAppearance» для ваших действий в файл styles.xml:

<style name="AppThemeActivity" parent="Theme.AppCompat.Light">
    <item name="android:actionMenuTextAppearance">@style/yourstyle</item>
    ...
</style>

Примените этот стиль к своей деятельности в своем манифесте:

<activity 
android:theme="@style/AppThemeActivity"
.../>
person Pink Cocot    schedule 21.07.2015

Итак, прошло много времени с тех пор, как об этом спросили, но мне нравится это решение, поскольку ответ Стивена Смита меняет каждое мнение:

Добавьте эту строку в NavigationView:

app:itemTextAppearance="@style/MenuItems"

И это к стилям:

<style name="MenuItems" parent="AppTheme">
    <item name="android:textSize">18sp</item>
    <item name="android:fontFamily">sans-serif-light</item>
</style>
person jobbert    schedule 07.07.2017
comment
И в этом проблема: он меняет КАЖДОЕ представление. Большинство программистов хотят, чтобы размер текста менялся в зависимости от размера/плотности экрана. - person FractalBob; 13.10.2017
comment
Вот что я имел в виду, мое решение не меняет каждое представление. - person jobbert; 14.10.2017
comment
Я имел в виду, что ваше решение не зависит от размера/плотности экрана. Мне нужен способ, чтобы пункты меню росли с размером экрана. - person FractalBob; 15.10.2017
comment
@FractalBob SP и DP не зависят от экрана. Если вы хотите иметь одинаковый размер в процентах, вы должны использовать проценты. Но это не рекомендуется. - person jobbert; 15.10.2017
comment
@FractalBob, то, что вы хотите сделать, будет очень сложно, если sp / dp не делает то, что вы хотите, потому что вы действительно не знаете, какого размера (в пикселях) ваш объект, пока не произойдет макет. Я думаю, что большинство программистов хотят, чтобы шрифт отображался на экране одного и того же физического размера независимо от размера/разрешения экрана в пикселях, на котором он отображается. И это цель dp/sp. И нет, он не изменяет каждое текстовое представление — он изменяет только те, которые используют AppTheme. Вы можете определить другой стиль и другой размер/цвет/гарнитуру шрифта и применить его по своему усмотрению. - person steven smith; 14.10.2018
comment
@zeleven, пожалуйста, читайте внимательнее. Я сказал NavigationView, если вам лень гуглить, вот ссылка: developer.android.com/reference/android/support/design/widget/. Никогда не говорил добавить его в пункты меню. И да, вам нужно будет использовать NavigationView для этого. - person jobbert; 25.04.2019

Хорошо работает и на старом API:

В вашем style.xml:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="actionMenuTextAppearance">@style/ActionMenuTextAppearance</item>
    <item name="android:actionMenuTextAppearance">@style/ActionMenuTextAppearance</item>
</style>

<style name="ActionMenuTextAppearance" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Menu">
    <item name="android:textSize">16sp</item>
    <item name="android:textColor">#1a1a1a</item>
</style>

В вашем манифесте:

<activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme"
        />
person researcher    schedule 05.06.2019

Или вы можете установить размер шрифта в элементе значений/стилей для темы, которую вы используете. В моем случае стиль, указанный в файле AndroidManifest.xml:

android:theme="@style/AppTheme"

Итак, мой стиль для AppTheme теперь такой:

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:textSize">20sp</item>
</style>

Хотя странно, что этот пункт не работает...

person steven smith    schedule 05.08.2014
comment
Это влияет на текстовые представления всех приложений :( - person Mani; 04.01.2015