【问题标题】:How the display bug of TextView drawableStart can be explained?TextView drawableStart的显示bug怎么解释?
【发布时间】:2013-02-27 16:32:47
【问题描述】:

更新:在此处创建和呈现更简单的代码,完整的布局 XML 定义。

当尝试用 XML 布局中 TextView 元素的新 drawableStart 属性替换左侧图标的行布局时,我可以观察到以下错误显示的最后一项(在 Nexus 7 上捕获):

相关代码为--MainActivity:

package cz.skil.android.tut.testtextviewdrawablestart;

import android.os.Bundle;
import android.app.Activity;
import android.widget.ListView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_list);

        ListView listView = (ListView) findViewById(R.id.mylist);
        String[] values = new String[] {"item 1", "item 2", "item 3"};

        MyAdapter adapter = new MyAdapter(this, values);

        listView.setAdapter(adapter);         
    }
}

我的适配器

package cz.skil.android.tut.testtextviewdrawablestart;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;

    public MyAdapter(Context context, String[] values) {
        super(context, R.layout.row, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.row, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.mylabel);
        textView.setText(values[position]);
        return rowView;
    }
}

main_list.xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" > <!-- Update: here is the bug -->
    </ListView>

</LinearLayout>

最后是row.xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/mylabel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"

    android:layout_marginLeft="4dp"
    android:drawablePadding="8dp"
    android:drawableStart="@drawable/reminder"       

    android:lines="1"
    android:textSize="24sp" >

</TextView>

我猜原因是显示项目区域的高度是根据为文本声明的尺寸计算的;但是,该图标可能会强制列表项的高度更大。

你能确认一下行为吗?如果是,为什么它会这样?我是安卓新手。很可能我做错了。

(这个问题与这个问题大致相关:Android layout: on TextView and android:drawableStart -- setting size of the icon?)。

【问题讨论】:

  • 似乎更像是您的布局的其余部分(列表视图?它在其中)或您的 java 代码中的问题,如果您在其中添加/调整它。尝试发布更多 xml 和代码。
  • 代码来自 Lars Vogel 教程。原始布局在这里vogella.com/articles/AndroidSQLite/article.html#todo_layouttodo_row.xmltodo_list.xml),显示屏幕的活动是下面显示的TodosOverviewActivity.javavogella.com/articles/AndroidSQLite/article.html#todo_activities)。我还没有更简单的代码。但我会努力准备的。
  • 嗯,奇怪,抱歉不知道。
  • android:layout_height="wrap_content" 设置为ListView 总是错误的。它可以与android:layout_height="fill_parent" 一起正常工作。
  • @vmironov:请写下您的评论作为答案。我会将其标记为已接受。我没有注意到我的错误。 match_parent 使它工作。谢谢!

标签: android android-layout android-widget textview


【解决方案1】:

为 ListView 设置android:layout_height="wrap_content" 总是错误的。它与android:layout_height="fill_parent" 一样工作。更详细的解释可以在这里找到The World of ListView

【讨论】:

  • 感谢您的链接。这准确地解释了这种行为。
【解决方案2】:

虽然我不知道这是预期的行为还是错误,但当您使用 drawableStart 时会发生这种情况。改成drawableLeft就可以正常绘制布局了。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/mylabel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"

    android:layout_marginLeft="4dp"
    android:drawablePadding="8dp"
    android:drawableLeft="@drawable/reminder"       

    android:lines="1"
    android:textSize="24sp" >

</TextView>

【讨论】:

  • 到目前为止我的 +1。我也试过drawableRightdrawableTopdrawableBottom,它们也工作得很好。但是,drawableEnddrawableStart 类似错误。那么drawableStartdrawableEnd的目的是什么?
  • 它用于支持 rtl 语言。理想情况下,它的行为应该与英语的 drawableLeft 相同(除非它有其他用途)。看看这里developer.android.com/about/versions/…
  • 谢谢。 RTL 原因在上下文中是有意义的。如果有人能够说这是否是一个错误?
猜你喜欢
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2012-11-21
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多