Spannable строка не отображается, когда макет вертикальн - PullRequest
0 голосов
/ 20 марта 2019

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

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

В любом случае происходит то, что textView со сменным модулем корректно отображается на некоторых устройствах (т. Е. На планшете или на устройствах с большим экраном, но не на всех, т. Е. Проблема имеет один плюс один), но на других устройствах это не так. отображается вообще (выглядит более не обновленным, так как я попытался поместить строку-заполнитель, и эта строка отображается, даже если я уверен, что вызывается метод 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 не пуста. И когда в ландшафтном режиме он отображает текст. Я думал, что это может быть связано с проблемой размеров, поэтому я попытался сделать строку меньше, но безуспешно.

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

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

- ОБНОВЛЕНИЕ

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

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

Хорошо, это интересно, я попытался прокомментировать использование spannable строки и использовать только текст, как есть, я столкнулся с той же проблемой. Вероятно, сусла, показывающего метод 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, который не обновляется.

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

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

1 Ответ

0 голосов
/ 20 марта 2019

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

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

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

...