【问题标题】:Resizing text on a spinner调整微调器上的文本大小
【发布时间】:2013-06-08 16:58:00
【问题描述】:

我使用以下功能在选择项目时调整微调器上的文本大小:

mySpinner.post(new Runnable()
{
    public void run()
    {
        mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
            {
                TextView tempView = ((TextView) parent.getChildAt(0));
                ((TextView) parent.getChildAt(0)).setTextSize(TypedValue.COMPLEX_UNIT_PX, SetTextSize(tempView.getText().toString(), tempView.getWidth() - tempView.getPaddingLeft() - tempView.getPaddingRight(), (int) fieldHeight - tempView.getPaddingTop() - tempView.getPaddingBottom()));
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {
                // Do nothing
            }
        });
    }
});

问题是,在将文本调整为正确大小之前,文本以不正确的大小绘制。我需要做的是在选择项目后立即调用我的函数 SetTextSize。我无论如何都找不到这样做。 setOnItemSelectedListener 不会执行,因为在事件运行之前文本以不正确的大小显示。

我变了:

mySpinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, CHOICES));

收件人:

mySpinner.setAdapter(new MyArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, CHOICES));

并添加了以下类:

public class MyArrayAdapter extends ArrayAdapter
{
    public MyArrayAdapter(Context context, int textViewResourceId, Object[] objects)
    {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ((TextView) convertView).setTextSize(TypedValue.COMPLEX_UNIT_PX, SetTextSize(((TextView) convertView).getText().toString(), convertView.getWidth() - convertView.getPaddingLeft() - convertView.getPaddingRight(), (int) fieldHeight - convertView.getPaddingTop() - convertView.getPaddingBottom()));
        return convertView;
    }
}

不幸的是,现在我的程序在启动时立即崩溃。

我创建了以下类:

class MySpinnerAdapter extends ArrayAdapter<String>
{
    MySpinnerAdapter()
    {
        super(MainActivity.this, R.layout.row, R.id.label, CHOICES);
    }
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View row = super.getView(position, convertView, parent);
        TextView label = (TextView)row.findViewById(R.id.label);
        if (label != null)
            label.setTextSize(TypedValue.COMPLEX_UNIT_PX, SetTextSize(label.getText().toString(), label.getWidth() - label.getPaddingLeft() - label.getPaddingRight(), (int) fieldHeight - label.getPaddingTop() - label.getPaddingBottom()));
        return(row);
    }
}

我现在有两个问题。首先,这一行导致我的程序崩溃:

label.setTextSize(TypedValue.COMPLEX_UNIT_PX, SetTextSize(label.getText().toString(), label.getWidth() - label.getPaddingLeft() - label.getPaddingRight(), (int) fieldHeight - label.getPaddingTop() - label.getPaddingBottom()));

其次,将“row.xml”中的样式应用于我的微调器。如果我没有指定任何样式,那么我的程序就会崩溃。我只是不希望 xml 文件改变我的微调器的外观,因为我在编译时不知道。我希望微调器使用它在创建 XML 文件之前使用的默认值,以及我可以在代码中更改的任何其他内容。

【问题讨论】:

  • 你可以试试我的分析器here
  • 那行不通,因为我没有使用 XML。我不知道如何让 XML 动态工作,所以我不能使用它。

标签: java android text size spinner


【解决方案1】:

更改您的此代码

mySpinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, CHOICES));

mySpinner.setAdapter(new ArrayAdapter<String>(this, R.layout.spinner_layout, CHOICES));

spinner_layout.xml 的代码在哪里

 <?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:layout_width="fill_parent"
android:layout_height="48dp"
android:gravity="center_vertical"
android:textColor="@color/green"
android:paddingLeft="4dp"
android:textSize="18sp"
android:ellipsize="marquee"
android:singleLine="true" />

根据需要更改 layout_height 和文本大小

【讨论】:

  • 我不可能根据我在 XML 中的需要设置 layout_height 和文本大小。我只是在运行时才知道 layout_height 和文本大小。如果我必须使用 XML,我不希望我的 XML 对我的样式产生任何影响。也许我应该动态编写 XML 文件,并使用微调器默认提供的相同样式设置它。然后,我可以使用 XML,但 XML 不会影响它的外观。我知道这违背了 XML 的目的,但我想要做的就是在选择项目时运行 1 行代码
  • 我无法理解您需要什么。但我想你应该知道你需要什么尺寸
  • 我怎么知道我需要什么尺寸?我正在使我的程序在尽可能多的设备上兼容,因此我需要在运行时根据屏幕的宽度和高度计算大小。这行代码完美地计算了文本大小: ((TextView) parent.getChildAt(0)).setTextSize(TypedValue.COMPLEX_UNIT_PX, SetTextSize(tempView.getText().toString(), tempView.getWidth() - tempView.getPaddingLeft( ) - tempView.getPaddingRight(), (int) fieldHeight - tempView.getPaddingTop() - tempView.getPaddingBottom()));
【解决方案2】:

我终于可以完美地调整微调器上的文本,并且我认为代码很有效。感谢所有试图提供帮助的人。 :)

class MySpinnerAdapter extends ArrayAdapter<String>
{
    MySpinnerAdapter(int dropDownResource, String[] choices)
    {
        super(MainActivity.this, dropDownResource, choices);
    }
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        if (row == null)
            row = super.getView(position, convertView, parent);
        if (parent.getWidth() > 0)
        {
            TextView label = (TextView) row.findViewById(android.R.id.text1);
            label.setTextSize(TypedValue.COMPLEX_UNIT_PX, SetTextSize(label.getText().toString(), parent.getWidth() - label.getPaddingLeft() - label.getPaddingRight(), (int) fieldHeight - label.getPaddingTop() - label.getPaddingBottom()));
            label.setPadding(label.getPaddingLeft(), 0, 0, 0);
        }
        return(row);
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多