Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android-textview. Показать все сообщения
Показаны сообщения с ярлыком android-textview. Показать все сообщения

пятница, 13 марта 2020 г.

Как установить textSize в TextView как в actionBar

#android #android_textview


Как можно установить атрибут textSize в TextView ( в xml-файле) такой же как в actionBar
? Ну т.е. что бы размер шрифта в actionBar и TextView был одинаковый.





    



    


Ответы

Ответ 1



Используйте для указания размера текста в вашем TextView атрибуты из системных стилей: TextAppearance.Widget.ActionBar.Title - размер для заголовков в экшенбаре (он соответствует системному размеру TextAppearance.Medium) TextAppearance.Widget.ActionBar.Subtitle - размер для подзаголовков в экшенбаре (он соответствует системному размеру TextAppearance.Small) Узнать значения, установленные для системных виджетов, вы можете из исходников Android. Так, например, все значения системных атрибутов для телефонов находятся в файле res/values/styles.xml системного пакета framework-res.apk

Как изменить межбуквенное растояние?

#android #android_textview


Как убрать/уменьшить межбуквенный интервал (запас для символа другой ширины)?

C этим ответом ознакомился, но ни вариант с кастомной вьюхой, ни android:textScaleX
мне не подходит.


    


Ответы

Ответ 1



Эту возможность добавили в API 21: .setLetterSpacing(float) или в xml файл: android:letterSpacing Если вы хотите решить эту задачу в более ранних версиях, вам нужно создать ваш TextView public myTextView(Context context, AttributeSet attrs) { super(context, attrs); } в AttributeSet написать пару строчек, в которых проставите свои "spacing" между буквами.

пятница, 6 марта 2020 г.

Помогите инициализировать TextView

#android #textview #android_textview


Итак, есть layout, содержащий 2 объекта — RecycledView и TextView. RecyclerView работает
через адаптер, который передаёт значение в TextView. Выглядит это так. Фрагмент, содержащий
TextView:

public class FragmentCharts extends Fragment {

//объявляем TextView
TextView chartDetailsHeader;

public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_charts, container, false);

    RecyclerView rationsChart = (RecyclerView) view.findViewById(R.id.rations_chart);
    rationsChart.setHasFixedSize(true);

    LinearLayoutManager rationsChartLayoutManager = new LinearLayoutManager(
            getContext(),
            LinearLayoutManager.HORIZONTAL,
            true);
    rationsChart.setLayoutManager(rationsChartLayoutManager);

    ChartAdapter chartAdapter = new ChartAdapter();
    rationsChart.setAdapter(chartAdapter);

    //инициализируем TextView
    chartDetailsHeader = (TextView) view.findViewById(R.id.chart_details_heading);
    chartDetailsHeader.setTypeface(CommonSettings.getRobotoCondLight());
    return view;
}

//метод для изменения значения TextView
public void setChartHeader(Date date) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM", Locale.US);
    String s = dateFormat.format(date);
    chartDetailsHeader.setText(s);
}
}


Изменение TextView происходит отправкой метода из адаптера:

new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());


Как я понимаю, при создании new FragmentCharts() должна происходить инициализация
TextView, но в методе setChartHeader() значение TextView почему-то null.

Пытался инициализировать TextView повторно в setChartsHeader(), но где взять view
для инициализации?

В общем, как обычно, нужна помощь.
    


Ответы

Ответ 1



Ваш код new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate()); каждый раз создаёт новый фрагмент. Но так как он ни куда не аттачится и не отображается, соответственно у него не вызываются никакие методы жизненного цикла, в том числе и onCreateView, в котором вы инициализируете TextView. Поэтому он и null. Как решить? Не создавать новый объект фрагмента, а вызывать метод у существующего. То есть, например, добавить в конструктор адаптера параметр FragmentCharts fragment, и обращаться уже к нему. Во фрагменте у вас будет: ChartAdapter chartAdapter = new ChartAdapter(this); А в адапрере: private FragmentCharts fragment; public ChartAdapter(FragmentCharts fragment) { this.fragment = fragment; } ... fragment.setChartHeader(archivesForCharts.get(0).get(0).getDate()); ...

среда, 4 марта 2020 г.

Как зафиксировать views на layout, чтобы верстка не поехала на разных экранах?

#android #android_textview #android_button


Как разместить на весь экран TextView, а в самом низу Button?

TextView должен находится внутри ScrollView, а Button не должна перекрывать TextView.

Какой лучше использовать корневой елемент для этой цели?

Вот что уже есть, но кнопка перекрывает TextView:




    

        

    

    


Ответы

Ответ 1



Можете попробовать использовать weight Это атрибут макета LinearLayout. Будет работать на всех экранах. Вот код:

пятница, 28 февраля 2020 г.

Шрифт в TextView Android

#android #шрифты #android_textview


Создаю динамически элемент TextView. Нужно установить шрифт, который использует остальная
часть программы. При вызове этого кода приложение падает.     

            TextView textDis = new TextView(this.getContext());
            textDis.setPadding(16, 16, 16, 16);
            textDis.setTextColor(getResources().getColor(R.color.colorBlack));
            textDis.setTextSize(18);
            //Ошибочный код ниже:
            textDis.setTypeface(getResources().getFont(R.font.fira_sans), Typeface.BOLD);


Спасибо за помощь!
    


Ответы

Ответ 1



Для шрифтов рекомендую использовать папку assets и устанавливать вот так: textDis.setTypeface(Typeface.createFromAsset(getAssets(), "my_font_bold.ttf"); Кроме того, чтобы избежать лагов (а если у вас много текстов со своим шрифтом они будут), рекомендую шрифт кэшировать, например так: public class TypeFaces { //---Кэширование шрифта--- private static final Hashtable cache = new Hashtable(); public static Typeface get(Context c, int type) { String name; if (type == 1) name = "my_font.ttf"; else name = "my_font_bold.ttf"; synchronized (cache) { if (!cache.containsKey(name)) { String path = name; try { Typeface t = Typeface.createFromAsset(c.getAssets(), path); cache.put(name, t); } catch (Exception e) { e.printStackTrace(); } } return cache.get(name); } } } И использовать так: textDis.setTypeface(TypeFaces.get(this, 2)); Если у вас много текстов, самым лучшим вариантом будет создать кастомный TextView, где в init() шрифт будет будет выставляться автоматически. Либо можно воспользоваться методом из support библиотеки: textDis.setTypeface(ResourcesCompat.getFont(context, R.font.my_font));

среда, 5 февраля 2020 г.

При выводе text.setText(R.string.slovo + “ ” + intValue); - выводится инт адрес ресурса

#android #android_textview


При выводе text.setText(R.string.slovo + " " + intValue);- выводится int адрес ресурса.Нужно
чтобы выводился String из ресурса плюс intValue. intValue меняется динамически поэтому
загонять его в ресурсы смысла нет.
    


Ответы

Ответ 1



Все правильно вы должны образаться к ресурсам черех getResources. Пример getResources().getString(R.string.slovo )

Ответ 2



В дополнение к ответу @elik хотелось бы отметить, что Android API предоставляет специальный метод для форматирования ресурсов Resources.html#getString(int, java.lang.Object...). В нём есть свои подводные камни, но в целом он работает достаточно просто и делает код чище. Например, Hello, %s! text.setText(getString(R.string.my_string_to_format, "world")); Слово world будет автоматически подставлено вместо %s. Это особенно важно для локализации, т.к. в различных языках строка/число, которое вы хотите добавить, может находиться в разных частях предложения! Вы можете добавлять произвольное число параметров к строке. Например, I have %1$d %2$s text.setText(getString(R.string.my_string_to_format, 10, "frogs"));

воскресенье, 2 февраля 2020 г.

Как в TextView установить разный цвет для каждого символа

#android #textview #color #android_textview


Есть к примеру текст "10/5" и как в TextView сделать чтоб к примеру число 10 было
зеленым цветом, слэш серым, а число 5 красным
    


Ответы

Ответ 1



Можно избежать использования HTML при помощи такого способа: TextView TV = (TextView)findViewById(R.id.mytextview01); Spannable word = new SpannableString("Your message"); word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); TV.setText(word); Spannable wordTwo = new SpannableString("Your new message"); wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); TV.append(wordTwo);

Ответ 2



TextView поддерживает простейшие теги HTML, вроде . Использовать можно так: textView.setText(HTML.fromHtml("10/5"));

понедельник, 6 января 2020 г.

Как для TextView задать программно стиль?

#android #textview #android_textview


Например:

TextView textView = new TextView(PhotoActivity.this);
    textView.setText("Photo not found.");


Тогда как задать стиль?

textView.set...???


Мне нужно было сделать цвет текста и позиционирование по центру программно, я решил
задачку:

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT,
AbsListView.LayoutParams.FILL_PARENT);
    params.weight = 1.0f;
    params.gravity = Gravity.CENTER;

    TextView textView = new TextView(PhotoActivity.this);
    textView.setText("Photo not found.");
    textView.setTextColor(Color.WHITE);
    textView.setLayoutParams(params);


Как вариант так:

textView.setGravity(Gravity.CENTER);

    


Ответы

Ответ 1



Вам поможет textView.setTextAppearance(int styleResId);

Ответ 2



textView59.setTypeface(null, Typeface.BOLD);

Ответ 3



Это, ксожалению, невозможно. Но выход есть: Создать xml файл с TextView с нужным стилем: И дальше программно его инфлейтить: TextView textView = (TextView) LayoutInflater.from(context).inflate(R.layout.styled_textView, null); Если хочется именно программно выбрать стиль, не создавая отдельную разметку для каждого стиля, можете сохранить один вариант разметки где-нибудь в assets, дальше загружать его, как обычный XML-документ, изменять ему атрибут style, и скармливать LayoutInflaterу в этот метод

Double - показать все цифры после точки

#java #android #android_textview


Есть число 75.4500000, которое получаю при помощи LocationManager(GPS координаты).
LocationManager получает координаты и преобразовывает данное значение в 75.45, т.е.
обрезает нули, а нужно получать точную цифру.

Как сделать так, чтобы оно не обрезалось, а показывалось полностью? 
    


Ответы

Ответ 1



Если Вы отображаете в TextView, просто используйте String.format: textView.setText(String.format("%.7f",d)); d - Ваш double.

воскресенье, 29 декабря 2019 г.

Анимация появления текста в TextView

#android_textview #анимация #android


Мне нужно, чтобы по нажатию на кнопку появлялся текст как бы размытый и потом примерно
за две секунды становился чётким. Как это можно сделать? 
Или же чтобы при нажатии на кнопку текст постепенно появлялся, то есть при нажатии
чтобы он из полностью прозрачного постепенно становился полностью насыщенным. Как это
можно сделать?
Сам текст, который должен появляться при нажатии на кнопку, берётся из массива строк.
Если вы знаете как что-то из этого реализовать, то напишите, пожалуйста, спасибо.    


Ответы

Ответ 1



Есть вот такая либа. Мне лично очень нравится. Мечтаю наконец где-нибудь ее использовать... Тык

Ответ 2



Нашёл способ, чтобы текст постепенно из прозрачного становился видимым. В папке res/anim создаем файл анимации, например tv_animation.xml Содержание .xml файла: В активити задаём переменные TextView tv; Animation anim; В методе, который отвечает за вывод текста в TextView, пишем: anim = AnimationUtils.loadAnimation(this,R.anim.tv_animation); tv = (TextView) findViewById(R.id.answerText); tv.startAnimation(anim);

Ответ 3



Это просто. Вот анимация появления. Разобраться очень просто. Если массив строк в strings описан, то вам поможет вот этот вопрос.

пятница, 27 декабря 2019 г.

Некорректно отображается TextView без вызова setLayoutParams

#android #android_textview


Я создаю TextView в Java-коде и присваиваю ему стиль следующим образом:

TextView mTextView = new TextView(new ContextThemeWrapper(mContext, R.style.myStyle),
null, 0);


Вот XML-код стиля:




Но TextView в компоновке отображается некорректно. Я попробовал добавить эту команду
в Java-код:

mTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT, 1));


и только тогда элемент стал правильно отображаться. В чём заключается такая потребность
вызывать этот метод setLayoutParams, если я уже указал значение параметров android:layout_height,
android:layout_weight и android:layout_width в стиле? То есть, мой вопрос заключается
в том, почему без вызова в Java-коде метода setLayoutParams элементу не присваиваются
значения android:layout_height, android:layout_weight и android:layout_width из стиля
и как это исправить?
    


Ответы

Ответ 1



Так не очень хорошо делать при динамическом создании View изначально, старайтесь при динамической верстки все параметр использовать в коде, а стили выносить в отдельные классы, те создавать ваш StyleWrapper, иначе в вашем коде нет смысла не по производительности, не по структуре. Вы будуте дольше искать ошибки верстки постояно изучая несколько участков в коде. Хотя на практике есть примеры полностью динамической верстки больших приложений (telegram), и даже есть либы для упрощения. Не суть. Что касается ответа. Он прост. Никак setLayoutParams в вашем случае, не влияют на отображения вью если вы добавляете ваше View parent которого является LinearLayout. Вы прочитайте что такое ContextWrapper и для чего он необходим, уж точно не для того чтобы для всех View выставлять параметры, weight или gravity которые в большинстве случае не будут применены. у TextView применения стиля делается примерно так: TextViewCompat.setTextAppearance(textView, R.style.myStyle) для того чтобы вью добавить в любой parent необходимо сделать примерно так: TextView textView = new TextView(this); //создать textView.setText("всё хорошо"); //присвоить значение LinearLayout mainLayout = findViewById(R.id.mainLayout); mainLayout.addView(textView); // добавить View Если вы хотите данный View расположить определным образом у парента только тогда применяюстя LayoutParams, в зависимости какой парент у вас, это очень важно! textView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1)); //только сейчас вы выставляете вес = 1 mainLayout.addView(textView) // добавить View Исходя из этого вывод, вы не верно использовали стиль и когда создавали View не использовался weight 1, и ваша View скорей всего исчезала, после того как вы выставили ей вес через LayoutParams она начала отображаться. Аналоигчно и другим параметрам. Но чтоб такого не происходило, советую прочитать заголовок ответа. Успехов.

среда, 25 декабря 2019 г.

Создать идентичные 9х9 элементов TextView в виде таблички - с равными размерами

#android #android_textview #android_linearlayout #height #width


У меня есть компоновка LinearLayout вертикальной ориентации, в которой находятся
9 компоновок LinearLayout горизонтальной ориентации, в каждой из которых по 9 TextView
(итого 9 * 9 = 81 элемент TextView). Для грамотной реализации этого творчества я создаю
по 9 горизонтальных компоновок LinearLayout и по 9 TextView в каждой из них в Java-коде,
а затем, соответственно, добавляю их в основную компоновку компонента Activity примерно так:

for (int y = 8; y >= 0; y--) {
    LinearLayout mLinearLayout_row = ...//компоновка горизонтальной ориентации
    for (x = 0; x < 9; x++) {
        TextView mTextView = layoutInflater.inflate(R.layout.mtextview, ...
        mLinearLayout_row.addView(mMTextView);
    }
    myMainActivityLayout.addView(mLinearLayout_row, 0);
}


Все компоновки имеют длину MATCH_PARENT, а высоту WRAP_CONTENT. Вот код mtextview.xml:





На экране ширИны всех элементов TextView выглядят равными (если не вглядываться).
Но на самом деле система Android задаёт ширину нескольким последним элементам с правой
стороны во всех рядах чуть меньшую ширину - это система вычисляет алгоритмом за счёт
известного значения атрибута layout_weight у всех TextView.

Теперь перейду к проблеме. У меня не получается сделать элементы TextView квадратными,
таблица выглядит приплюснутой.



Я пробовал следующие способы:


Использовать кастомный TextView, в классе которого переопределив метод onMeasure:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}


Метод очень плох, так как элементы то делаются квадратными, но слева они большие,
а справа маленькие - это очень некрасиво выглядит.


Использовать кастомную основную компоновку LinearLayout, в классе которой переопределив
метод onMeasure (так же, как в п.1) и установив значение атрибута layout_height у TextView
на match_parent - вообще никаких изменений.
В коде компонента Activity, в которой всё это происходит, переопределить метод onResume,
в котором пытаться получить ширину всех TextView и задать им высоту, равную известной
ширине... в общем-то способ не профессиональный и не оптимальный, по моему мнению,
но, несмотря на это, я попробовал использовать этот способ, а оказалось, что, когда
вызывается метод onResume система ещё не знает ширину элементов!!! (значение функции
mTextView.getWidth(), полученное в этом методе равно 0).




Сожалею, что нереально тяжело въехать, в чём же у меня заключается проблема, но я
постарался максимально подробно и корректно описать её :).
    


Ответы

Ответ 1



Для того, чтобы сделать ячейки масшатбируемыми и квадратными, можно использовать свойство соотношения сторон app:layout_constraintDimensionRatio в ConstraintLayout: Это позволит вам сделать ячейки квадратными, вне зависимости от расширения экрана, т.к. они просто ужмутся по высоте и ширине Но я предлагаю пойти вам дальше и переверстать экран с помощью recyclerView (как предложил Виталий в комментариях). Во-первых, это избавит вас от проблемы адресации к этим ячейкам, ведь их нужно будет заполнять и считывать. А во-вторых, реализация с RecycelerView будет эстетичнее (в разметке RecyclerView + адаптер + ViewHolder - вы сами убедитесь в простоте такой реализации). Установив размер 1 в item RecyclerView, вы автоматически его установите всем ячейкам. Адаптер для RecyclerView стандартный, но нужно переопределить LayouManager. Создаете LayoutManager, наследуете его от GridLayoutManager (можно внутри адаптера): private static class NonScrollableGridLayoutManager extends GridLayoutManager { NonScrollableGridLayoutManager(Context context, int span) { super(context, span); } @Override public boolean canScrollVertically() { return false; } @Override public boolean canScrollHorizontally() { return false; } } В адаптере создаете метод, возвращающий объект LayoutManager: public static RecyclerView.LayoutManager getLayoutManager(Context context) { return new NonScrollableGridLayoutManager(context, COUNT_OF_ITEM_IN_LINE); } Затем устанавливаете для RecyclerView ваш LayoutManager: binding.monthContent.setLayoutManager(CalendarAdapter.getLayoutManager( binding.getRoot().getContext())); binding.monthContent.setAdapter(daysAdapter); binding.monthContent.setItemAnimator(null); Не правда ли удобно?

понедельник, 23 декабря 2019 г.

Как задать фон и цвет шрифта части текста в TextView на Андроид используя Html.TagHandler для неподдерживаемых HTML тэгов?

#java #android #android_textview


Дано:

Есть HTML код, в нём текст, в тексте код, заключённый в тэг Тут код. 

Задача:

Текст внутри тэга должен иметь нужный мне цвет и определённого цвета фон.

Вопрос: 

Как этого добиться, если учесть, что текст назначается (и должен продолжать назначаться)
TextView так:

textView.setText(Html.fromHtml(myAwesomeTextWithCode));

    


Ответы

Ответ 1



Для обработки неподдерживаемых тэгов надо передавать в качестве 3 аргумента метода Html.fromHtml экземпляр класса, расширяющего Html.TagHandler, в коем и будет происходить обработка всех неподдерживаемых на Android HTML тэгов: public class MyHtmlTagHandler implements TagHandler { @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if (tag.equalsIgnoreCase("code")) { processCode(opening, output); } } private void processCode(boolean opening, Editable output) { int len = output.length(); if (opening) { output.setSpan(new ForegroundColorSpan(Color.RED), len, len, Spanned.SPAN_MARK_MARK); output.setSpan(new BackgroundColorSpan(Color.GREEN), len, len, Spanned.SPAN_MARK_MARK); } else { Object obj = getLast(output, BackgroundColorSpan.class); int where = output.getSpanStart(obj); output.removeSpan(obj); if (where != len) { output.setSpan(new ForegroundColorSpan(Color.RED), where, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); output.setSpan(new BackgroundColorSpan(Color.GREEN), where, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } } private static Object getLast(Spanned text, Class kind) { /* * This knows that the last returned object from getSpans() * will be the most recently added. */ Object[] objs = text.getSpans(0, text.length(), kind); if (objs.length == 0) { return null; } return objs[objs.length - 1]; } } Т.е. теперь вы можете сделать так: String myAwesomeTextWithCode = "

некод-некод Тут код опять-не-код

"; textView.setText(Html.fromHtml(myAwesomeTextWithCode, null, new MyHtmlTagHandler()));

суббота, 21 декабря 2019 г.

Текст в TextView не более 2х строк, а если больше, то три точки добавить. Как сделать?

#android #android_textview


Нужно отобразить текст в TextView, но не более 2х строк, а если больше, то добавить
три точки в конце. Как это сделать?
    


Ответы

Ответ 1



android:maxLines="2" android:ellipsize="end" android:singleLine="false"

понедельник, 3 июня 2019 г.

Как для TextView задать программно стиль?

Например:
TextView textView = new TextView(PhotoActivity.this); textView.setText("Photo not found.");
Тогда как задать стиль?
textView.set...???
Мне нужно было сделать цвет текста и позиционирование по центру программно, я решил задачку:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.FILL_PARENT); params.weight = 1.0f; params.gravity = Gravity.CENTER;
TextView textView = new TextView(PhotoActivity.this); textView.setText("Photo not found."); textView.setTextColor(Color.WHITE); textView.setLayoutParams(params);
Как вариант так:
textView.setGravity(Gravity.CENTER);


Ответ

Вам поможет
textView.setTextAppearance(int styleResId);

Как установить textSize в TextView как в actionBar

Как можно установить атрибут textSize в TextView ( в xml-файле) такой же как в actionBar ? Ну т.е. что бы размер шрифта в actionBar и TextView был одинаковый.




Ответ

Используйте для указания размера текста в вашем TextView атрибуты из системных стилей:
TextAppearance.Widget.ActionBar.Title - размер для заголовков в экшенбаре (он соответствует системному размеру TextAppearance.Medium)
TextAppearance.Widget.ActionBar.Subtitle - размер для подзаголовков в экшенбаре (он соответствует системному размеру TextAppearance.Small)
Узнать значения, установленные для системных виджетов, вы можете из исходников Android. Так, например, все значения системных атрибутов для телефонов находятся в файле res/values/styles.xml системного пакета framework-res.apk

воскресенье, 2 июня 2019 г.

Как изменить межбуквенное растояние?

Как убрать/уменьшить межбуквенный интервал (запас для символа другой ширины)?
C этим ответом ознакомился, но ни вариант с кастомной вьюхой, ни android:textScaleX мне не подходит.


Ответ

Эту возможность добавили в API 21: .setLetterSpacing(float) или в xml файл: android:letterSpacing Если вы хотите решить эту задачу в более ранних версиях, вам нужно создать ваш TextView
public myTextView(Context context, AttributeSet attrs) { super(context, attrs); }
в AttributeSet написать пару строчек, в которых проставите свои "spacing" между буквами.

среда, 22 мая 2019 г.

Помогите инициализировать TextView

Итак, есть layout, содержащий 2 объекта — RecycledView и TextView. RecyclerView работает через адаптер, который передаёт значение в TextView. Выглядит это так. Фрагмент, содержащий TextView
public class FragmentCharts extends Fragment {
//объявляем TextView TextView chartDetailsHeader;
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_charts, container, false);
RecyclerView rationsChart = (RecyclerView) view.findViewById(R.id.rations_chart); rationsChart.setHasFixedSize(true);
LinearLayoutManager rationsChartLayoutManager = new LinearLayoutManager( getContext(), LinearLayoutManager.HORIZONTAL, true); rationsChart.setLayoutManager(rationsChartLayoutManager);
ChartAdapter chartAdapter = new ChartAdapter(); rationsChart.setAdapter(chartAdapter);
//инициализируем TextView chartDetailsHeader = (TextView) view.findViewById(R.id.chart_details_heading); chartDetailsHeader.setTypeface(CommonSettings.getRobotoCondLight()); return view; }
//метод для изменения значения TextView public void setChartHeader(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM", Locale.US); String s = dateFormat.format(date); chartDetailsHeader.setText(s); } }
Изменение TextView происходит отправкой метода из адаптера:
new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());
Как я понимаю, при создании new FragmentCharts() должна происходить инициализация TextView, но в методе setChartHeader() значение TextView почему-то null
Пытался инициализировать TextView повторно в setChartsHeader(), но где взять view для инициализации?
В общем, как обычно, нужна помощь.


Ответ

Ваш код new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate()); каждый раз создаёт новый фрагмент. Но так как он ни куда не аттачится и не отображается, соответственно у него не вызываются никакие методы жизненного цикла, в том числе и onCreateView, в котором вы инициализируете TextView. Поэтому он и null
Как решить? Не создавать новый объект фрагмента, а вызывать метод у существующего. То есть, например, добавить в конструктор адаптера параметр FragmentCharts fragment, и обращаться уже к нему. Во фрагменте у вас будет:
ChartAdapter chartAdapter = new ChartAdapter(this);
А в адапрере:
private FragmentCharts fragment;
public ChartAdapter(FragmentCharts fragment) { this.fragment = fragment; } ... fragment.setChartHeader(archivesForCharts.get(0).get(0).getDate()); ...

вторник, 21 мая 2019 г.

Как зафиксировать views на layout, чтобы верстка не поехала на разных экранах?

Как разместить на весь экран TextView, а в самом низу Button?
TextView должен находится внутри ScrollView, а Button не должна перекрывать TextView
Какой лучше использовать корневой елемент для этой цели?
Вот что уже есть, но кнопка перекрывает TextView




понедельник, 8 апреля 2019 г.

При выводе text.setText(R.string.slovo + “ ” + intValue); - выводится инт адрес ресурса

При выводе text.setText(R.string.slovo + " " + intValue);- выводится int адрес ресурса.Нужно чтобы выводился String из ресурса плюс intValue. intValue меняется динамически поэтому загонять его в ресурсы смысла нет.


Ответ

Все правильно вы должны образаться к ресурсам черех getResources. Пример
getResources().getString(R.string.slovo )