Android 谜团:文本在随机 TextView 中消失
Android Mystery: Text Disappearing in random TextView
我的应用程序有问题 Life Gallery。在此应用程序中,我有一个片段在 gridView 中显示用户的媒体目录。这是屏幕截图:
如您所见,每个目录都由一个 ImageView 和一个 TextView 表示,后者包含目录的名称。如果你检查第三行,你会看到两个 TextView 的文本是空的......这是我的错误。如果我滚动或旋转我的 phone...
,则出现此类错误的 gridview 元素会有所不同
这是我对 gridView 元素的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_global"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="1dp" >
<ImageView
android:id="@+id/directory_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/content_description_album_imageview" />
<TextView
android:id="@+id/directory_text"
style="@style/Act_MyOwnLife_TextView_large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/directory_image"
android:background="@color/black_transparent"
android:gravity="right"
android:paddingRight="4dp"
android:singleLine="true"
/>
</RelativeLayout>
下面是我的 Adapter 的代码,主要关注函数 getView:
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder viewHolder = null;
if (view == null) {
LayoutInflater inflater = this.activity.getLayoutInflater();
view = inflater.inflate(R.layout.fragment_directory_gridview, parent, false);
viewHolder = new ViewHolder();
viewHolder.relativeLayout = (RelativeLayout)view.findViewById(R.id.layout_global);
viewHolder.textViewDirectory = (TextView) view.findViewById(R.id.directory_text);
viewHolder.imageViewDirectory = (ImageView) view.findViewById(R.id.directory_image);
view.setTag(R.id.viewHolder, viewHolder);
}else{
viewHolder = (ViewHolder) view.getTag(R.id.viewHolder);
}
viewHolder.relativeLayout.setLayoutParams(this.viewFragmentDirectory.layoutParams);
viewHolder.imageViewDirectory.setTag(position);
viewHolder.imageViewDirectory.setImageBitmap(null);
viewHolder.position = position;
ModelDirectoryAndMedia directoryAndImage =this.directoriesAndMedias.get(position);
viewHolder.textViewDirectory.setText(directoryAndImage.directoryView);
ImageView imageView = viewHolder.imageViewDirectory;
// creation/retrieve the thumbnail with a thread
job = new Job(imageView,
directoryAndImage.media, Options.OPTIONS_THUMBNAIL,
position);
this.bitmapCreate.addJobThumbnail(job);
return view;
}
我为找到错误所做的工作:
- 我在调用 "viewHolder.textViewDirectory.setText(s);"
时检查我的字符串是否为空
- 我尝试使用 hierarchyViewer 检查,但如果 TextView 为空,我将无法浏览元素...我不知道为什么...
- 我去掉背景的透明度,去掉textView的背景属性,我设置"ImageView.setImageBitmap(null);"检查是不是ImageView的原因...
但是没有成功...错误仍然存在...
经过多次测试,我找到了错误的原因:是由于getView方法中的这行代码:
viewHolder.relativeLayout.setLayoutParams(this.viewFragmentDirectory.layoutParams);
我使用这一行将空的 ImageView 显示为正确的大小。这样当缩略图准备好后,ImageView中的插入不会改变它的大小(我的LayoutParams的设置是用我的缩略图的大小完成的)
有什么想法吗?对我的代码有什么意见吗?
非常感谢!
好的...错误是由于调用:
viewHolder.relativeLayout.setLayoutParams(this.viewFragmentDirectory.layoutParams);
但我不明白为什么...无论如何,我这样做是为了确保我的 ImageView 具有正确的初始大小来显示由线程加载的缩略图。
所以我找到了另一个解决方案来为 ImageView 设置最小尺寸,即使它们是空的也是如此:
viewHolder.imageView.setMinimumHeight(this.viewControlerAlbum.sizeThumbnail);
viewHolder.imageView.setMinimumWidth(this.viewControlerAlbum.sizeThumbnail);
我的 layout.xml 文件更新了一点:
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/content_description_album_imageview"
android:scaleType="centerCrop"
android:adjustViewBounds="true"/>
我添加了 adjustViewBounds 属性。
我的应用程序有问题 Life Gallery。在此应用程序中,我有一个片段在 gridView 中显示用户的媒体目录。这是屏幕截图:
如您所见,每个目录都由一个 ImageView 和一个 TextView 表示,后者包含目录的名称。如果你检查第三行,你会看到两个 TextView 的文本是空的......这是我的错误。如果我滚动或旋转我的 phone...
,则出现此类错误的 gridview 元素会有所不同这是我对 gridView 元素的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_global"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="1dp" >
<ImageView
android:id="@+id/directory_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/content_description_album_imageview" />
<TextView
android:id="@+id/directory_text"
style="@style/Act_MyOwnLife_TextView_large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/directory_image"
android:background="@color/black_transparent"
android:gravity="right"
android:paddingRight="4dp"
android:singleLine="true"
/>
</RelativeLayout>
下面是我的 Adapter 的代码,主要关注函数 getView:
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder viewHolder = null;
if (view == null) {
LayoutInflater inflater = this.activity.getLayoutInflater();
view = inflater.inflate(R.layout.fragment_directory_gridview, parent, false);
viewHolder = new ViewHolder();
viewHolder.relativeLayout = (RelativeLayout)view.findViewById(R.id.layout_global);
viewHolder.textViewDirectory = (TextView) view.findViewById(R.id.directory_text);
viewHolder.imageViewDirectory = (ImageView) view.findViewById(R.id.directory_image);
view.setTag(R.id.viewHolder, viewHolder);
}else{
viewHolder = (ViewHolder) view.getTag(R.id.viewHolder);
}
viewHolder.relativeLayout.setLayoutParams(this.viewFragmentDirectory.layoutParams);
viewHolder.imageViewDirectory.setTag(position);
viewHolder.imageViewDirectory.setImageBitmap(null);
viewHolder.position = position;
ModelDirectoryAndMedia directoryAndImage =this.directoriesAndMedias.get(position);
viewHolder.textViewDirectory.setText(directoryAndImage.directoryView);
ImageView imageView = viewHolder.imageViewDirectory;
// creation/retrieve the thumbnail with a thread
job = new Job(imageView,
directoryAndImage.media, Options.OPTIONS_THUMBNAIL,
position);
this.bitmapCreate.addJobThumbnail(job);
return view;
}
我为找到错误所做的工作:
- 我在调用 "viewHolder.textViewDirectory.setText(s);" 时检查我的字符串是否为空
- 我尝试使用 hierarchyViewer 检查,但如果 TextView 为空,我将无法浏览元素...我不知道为什么...
- 我去掉背景的透明度,去掉textView的背景属性,我设置"ImageView.setImageBitmap(null);"检查是不是ImageView的原因...
但是没有成功...错误仍然存在...
经过多次测试,我找到了错误的原因:是由于getView方法中的这行代码:
viewHolder.relativeLayout.setLayoutParams(this.viewFragmentDirectory.layoutParams);
我使用这一行将空的 ImageView 显示为正确的大小。这样当缩略图准备好后,ImageView中的插入不会改变它的大小(我的LayoutParams的设置是用我的缩略图的大小完成的)
有什么想法吗?对我的代码有什么意见吗?
非常感谢!
好的...错误是由于调用:
viewHolder.relativeLayout.setLayoutParams(this.viewFragmentDirectory.layoutParams);
但我不明白为什么...无论如何,我这样做是为了确保我的 ImageView 具有正确的初始大小来显示由线程加载的缩略图。
所以我找到了另一个解决方案来为 ImageView 设置最小尺寸,即使它们是空的也是如此:
viewHolder.imageView.setMinimumHeight(this.viewControlerAlbum.sizeThumbnail);
viewHolder.imageView.setMinimumWidth(this.viewControlerAlbum.sizeThumbnail);
我的 layout.xml 文件更新了一点:
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/content_description_album_imageview"
android:scaleType="centerCrop"
android:adjustViewBounds="true"/>
我添加了 adjustViewBounds 属性。