垂直布局时不显示 Spannable 字符串

Spannable string not displayed when layout is vertical

最近,我在我的应用程序中使用的一个 spannable 字符串在某些设备上停止显示。

它过去工作正常,但我不确定它何时停止工作(可能是在最近更新了 sdk 之后)。

无论如何,带有 spannable 的 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,由于某种原因,这是唯一一个没有更新的 TextView。

应该是有原因的。

另一件奇怪的事情是,即使我尝试为其设置一个常量字符串,它也不会显示它。

这就是我认为的问题所在 为了修复它,我必须删除该项目,并更改该项目的 ID。

但是在其他布局中挖掘,问题可能是因为我使用的是 activity 中的 findViewById 而不是视图,所以在另一个视图中有另一个名为 edition_name 的项目,所以我想activity 返回了该引用而不是与当前视图相关的引用。

我使用了 activity,因为在我的代码中我需要访问其他组件,而不仅仅是与视图相关的组件,所以我假设要避免起诉两个不同的对象只使用一个来访问所有内容。