Android-могу ли я увеличить размер текста для виджета NumberPicker?
У нас есть виджет NumberPicker в 3.0, но кажется, что textSize для этого виджета не может быть изменен. Я что-то упускаю или дело в этом? Я бы очень хотел увеличить размер шрифта, он довольно маленький со значением по умолчанию. Но я не вижу для него свойства textSize.
8 ответов
мы столкнулись с той же проблемой и в конечном итоге пересоздать NumberPicker локально. Существует более глубокий учебник здесь.
я смог выполнить это, расширив NumberPicker по умолчанию. Не идеально, но работает.
public class NumberPicker extends android.widget.NumberPicker {
public NumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void addView(View child) {
super.addView(child);
updateView(child);
}
@Override
public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) {
super.addView(child, index, params);
updateView(child);
}
@Override
public void addView(View child, android.view.ViewGroup.LayoutParams params) {
super.addView(child, params);
updateView(child);
}
private void updateView(View view) {
if(view instanceof EditText){
((EditText) view).setTextSize(25);
((EditText) view).setTextColor(Color.parseColor("#333333"));
}
}
}
тогда просто ссылайтесь на этот класс в своем XML-файле макета.
<com.yourpackage.NumberPicker
android:id="@+id/number_picker"
android:layout_width="43dp"
android:layout_height="wrap_content" />
следующее работало для меня (в API 15 / 4.0.3)
Примечание: решение aheuermann безопасно от потенциальных различий в реализации в NumberPicker
's макет в разных версиях Android (то есть,TextView
не всегда может быть в дочерней позиции 1).
TextView tv1 = (TextView)_numberPicker.getChildAt(1);
tv1.TextSize = 10;
я столкнулся с той же проблемой, я хотел увеличить размер текста NumberPicker, но не мог найти способ сделать это как часть виджета. Все вышеперечисленные ответы великолепны, но вместо этого я пошел со следующим решением, которое отвечало моим потребностям:
<NumberPicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleX="1.5"
android:scaleY="1.5"/>
это существенно увеличивает весь виджет.
переход к API 23, решение, представленное aheuermann, похоже, имеет проблемы. В источнике для NumberPicker размер текста устанавливается на основе дочернего элемента EditText при инициализации. Если вы попытаетесь изменить его позже, поле EditText станет большим, но все остальные числа, нарисованные непосредственно виджетом, все равно будут маленькими.
решение, с которым я собираюсь, имеет тот недостаток, что оно должно быть создано программно, а не через макет, но в противном случае оно работает как предназначенный. Во-первых, добавьте к своим стилям следующее.xml-файл:
<style name="NumberPickerText">
<item name="android:textSize">40dp</item>
</style>
затем вы можете создать экземпляр NumberPicker с помощью
ContextThemeWrapper cw = new ContextThemeWrapper(this, R.style.NumberPickerText);
NumberPicker np = new NumberPicker(cw);
предполагая, что это делается в рамках действия. Если нет, замените "это" на любой контекст, который у вас есть. Этот код эквивалентен установке темы, которая переопределяет все размеры TextView в пределах действия, но применяется только к NumberPicker и его дочерним элементам.
установите этот sytle только для вашего NumberPicker:
<style name="AppTheme.Picker" parent="Theme.AppCompat.Light.NoActionBar" >
<item name="android:textColorPrimary">@android:color/white</item>
<item name="android:textSize">20dp</item>
</style>
<NumberPicker
android:theme="@style/AppTheme.Picker"
android:id="@+id/yearNumberPicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
и <item name="android:textColorPrimary">@android:color/white</item>
изменение свойства textColor :
мы можем настроить представления внутри NumberPicker.
Он имеет три вида-
2 ImageButttons и 1 EditText.
if(numberPicker.getChildAt(1) instanceOf EditText)
{
EditText edt=(EditText)numberPicker.getChildAt(1);
//do customizations here
}
полная компоновка NumberPicker из исходного кода Android
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageButton android:id="@+id/increment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/numberpicker_up_btn"
android:paddingTop="22dip"
android:paddingBottom="22dip"
android:contentDescription="@string/number_picker_increment_button" />
<EditText
android:id="@+id/numberpicker_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Large.Inverse.NumberPickerInputText"
android:gravity="center"
android:singleLine="true"
android:background="@drawable/numberpicker_input" />
<ImageButton android:id="@+id/decrement"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/numberpicker_down_btn"
android:paddingTop="22dip"
android:paddingBottom="22dip"
android:contentDescription="@string/number_picker_decrement_button" />
</merge>
FYI, если вы используете aheuermann это решение (как и я), и вы также хотите реализовать прослушиватель для выбора номера, метод onValueChanged должен выглядеть так. Я думал, что поделюсь этим, так как мне потребовалось немного времени, чтобы понять это.
public void onValueChange(android.widget.NumberPicker picker, int oldVal, int newVal){
//your awesome methods to perform on value changed
}