垂直布局时不显示 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,因为在我的代码中我需要访问其他组件,而不仅仅是与视图相关的组件,所以我假设要避免起诉两个不同的对象只使用一个来访问所有内容。
最近,我在我的应用程序中使用的一个 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 字符串不为空。 当处于横向模式时,它会显示文本。我认为这可能与尺寸问题有关,所以我试图使字符串变小,但没有成功。
知道为什么会这样吗?
我检查了这个问题:
--更新
我发现的另一件有趣的事情是,如果我旋转屏幕并且它进入横向模式,字符串会出现(它使用另一个布局文件),当我将它旋转回垂直位置时,字符串会出现(未对齐)无论如何)。
第二次更新
好的,这很有趣,我试图评论 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,因为在我的代码中我需要访问其他组件,而不仅仅是与视图相关的组件,所以我假设要避免起诉两个不同的对象只使用一个来访问所有内容。