Расширяемая строка не отображается, когда макет вертикальный

Недавно расширяемая строка, которую я использовал в своем приложении, перестала отображаться на некоторых устройствах.

Раньше он работал, но потом я не уверен, когда он перестал работать (вероятно, после недавнего обновления SDK).

В любом случае, что происходит, так это то, что textView с spannable правильно отображается на некоторых устройствах (например, на планшетах или устройствах с большим экраном, не на всех, т.е. у одного плюс один есть эта проблема), но на других устройствах не отображается вообще (выглядит более не обновленным, так как я пытался поместить строку-заполнитель, и эта строка отображается, даже если я уверен, что вызывается метод setText).

Так что не знаю в чем может быть проблема. Это textView, который я использую:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="40dp"
        android:gravity="center"
        android:id="@+id/edition_name"
        android:shadowDx="3"
        android:shadowDy="3"
        android:shadowRadius="1.5"
        android:shadowColor="@color/transparentGrey"
        android:layout_below="@+id/space"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        />

И вот как я установил spannableString:

private void updateText(TextView textView, String title, String value){
        SpannableString styledString;

        if(title != null) {
            styledString = new SpannableString(title + ": " + value);
            styledString.setSpan(new StyleSpan(Typeface.BOLD), title.length() + 2, styledString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            styledString = new SpannableString(value);
            styledString.setSpan(new StyleSpan(Typeface.BOLD), 0, styledString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        Log.i(TAG, "Spannable String: " + styledString.toString());
        textView.setText(styledString);
        textView.invalidate();
    }

Я в другом случае. В любом случае все остальные составные строки, составленные в части if, работают правильно.

Проверенная строка spannable не пуста. И когда в ландшафтном режиме он отображает текст. Я подумал, что это может быть связано с проблемой размера, поэтому я попытался сделать строку меньше, но безуспешно.

Есть идеи, почему это происходит?

Я проверил этот вопрос: Почему мой spannable не отображается? Не уверен, что дело в ответе о высоте относится к моему случаю. На данный момент высота, установленная для textView, равна обертке.

--ОБНОВЛЕНИЕ

Еще одна интересная вещь, которую я обнаружил, заключается в том, что если я поворачиваю экран и он переходит в ландшафтный режим, появляется строка (используется другой файл макета), а когда я поворачиваю его обратно в вертикальное положение, появляется строка (все равно не выровненная).

Второе обновление

Хорошо, это интересно, я попытался прокомментировать использование spannable string и использовать только текст как есть, я столкнулся с той же проблемой. Вероятно, стоит показать метод onActivityCreated, в котором я заполняю компоненты:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if(savedInstanceState != null){
            edition = (Edition) savedInstanceState.getSerializable(EDITION_DETAIL);
        }
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
        boolean useAppStorage = preferences.getBoolean("network_symbols", false);
        String imagePath;
        Activity currentActivity = getActivity();
        TextView editionCodeView =    (TextView) currentActivity.findViewById(R.id.edition_code);
        TextView editionLaunchView =  (TextView) currentActivity.findViewById(R.id.edition_launch);
        TextView editionNameView =    (TextView) currentActivity.findViewById(R.id.edition_name);
        TextView editionSizeView = (TextView) currentActivity.findViewById(R.id.edition_size);
        ImageView editionImageView = (ImageView) currentActivity.findViewById(R.id.edition_detail_image);
        TextView otherAttributes = (TextView) currentActivity.findViewById(R.id.otherAttributes);
        TextView cardsComposition = (TextView) currentActivity.findViewById(R.id.cards_composition);
        Button gathererButton = (Button) currentActivity.findViewById(R.id.gatherer_button);
        gathererButton.setOnClickListener(this);
        if(edition != null) {
            updateText(editionCodeView, currentActivity.getString(R.string.edition_code), edition.getCode());
            showLaunchText(editionLaunchView, currentActivity, edition.getLaunchYear(), edition.getLaunchMonth());
            //updateText(editionNameView, null, edition.getName());
            if(edition.getTotalCards() != 0) {
                updateText(editionSizeView, currentActivity.getString(R.string.total_cards), String.valueOf(edition.getTotalCards()));
            }
            updateText(cardsComposition, edition);
            String extraProperties = buildExtraPropertiesString();
            if(extraProperties != null && !extraProperties.equals("")){
                updateText(otherAttributes, currentActivity.getString(R.string.other_attributes_label), extraProperties);
            }
            if(edition.getImage() == null) {
                editionImageView.setImageResource(R.drawable.ic_block_black_48dp);
            } else {
                if(!useAppStorage){
                    imagePath = SYMBOL_FOLDER + edition.getImage();
                } else {
                    imagePath = getActivity().getFilesDir() + "/" + SYMBOL_FOLDER + edition.getImage();
                }
                Drawable symbolDrawable = ImageUtils.loadImage(imagePath, getActivity().getAssets(), getResources(), SCALE_SIZE, useAppStorage);
                if(symbolDrawable != null){
                    editionImageView.setImageDrawable(symbolDrawable);
                } else {
                    editionImageView.setImageResource(R.drawable.ic_block_black_48dp);
                }
            }
            editionNameView.setText(edition.getName());
        }
    }

Третье обновление

Это очень странно, я пытался использовать непосредственно строку как есть, воссоздать новое текстовое представление с нуля, и по какой-то причине это единственный TextView, который не обновляется.

Должна быть причина.

И еще одна странная вещь: даже если я попытаюсь установить для нее константную строку, она ее не отобразит.


person Ivan    schedule 20.03.2019    source источник
comment
Доступна ли ваша переменная edition из saveInstanceState каждый раз? Тот факт, что при повороте устройства появляется текст, предполагает, что любое значение, которое вы хотите, передается неправильно.   -  person Mark    schedule 20.03.2019
comment
Да, так как все остальные поля заполнены правильно (и все они из редакции), единственное поле, которое по какой-то причине не отображается, это название редакции. Я попытался напечатать edition.getName перед его установкой, и он возвращает правильное имя. Но я опубликую еще одно обновление (проверьте через пару секунд).   -  person Ivan    schedule 20.03.2019
comment
потому что я на фрагменте?   -  person Ivan    schedule 20.03.2019
comment
ах и видимо проблема в макете, а не в коде! :)   -  person Ivan    schedule 20.03.2019


Ответы (1)


Так что я думаю, что это была проблема. Чтобы исправить это, я должен удалить элемент и изменить идентификатор элемента.

Но копаясь в других макетах, вероятно, проблема заключалась в том, что, поскольку я использовал findViewById из действия вместо представления, в другом представлении был еще один элемент с именем edition_name, поэтому я предполагаю, что действие вернуло эту ссылку вместо той, которая связана с Текущий вид.

Я использовал активность, так как в моем коде мне нужно было получить доступ к другим компонентам, не только связанным с представлением, поэтому я предположил, что не буду подавать в суд на два разных объекта, чтобы использовать только один для доступа ко всему.

person Ivan    schedule 20.03.2019