You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Studio XML中text属性最大字数及长文本显示问题咨询

解决TextView长文本显示问题

Hey there, let's break this down for you:

首先回答你的第一个问题:XML中TextView的android:text属性长度限制

其实Android并没有给这个属性设置明确的硬长度上限,但实际开发中,直接把超长文本(比如你5000行的词汇表)写在布局XML的android:text属性里会触发很多问题:

  • 构建工具(比如aapt)在解析XML时可能因为属性值过长出现解析失败,导致APK里该资源损坏
  • 即使构建成功,运行时系统加载这个超长资源也可能出现内存溢出或者显示异常,就像你遇到的空白情况

所以绝对不推荐直接在布局XML的text属性里写超长文本,正确的做法是把长文本单独存放,再加载到TextView中。

正确的长文本处理方案

方案1:使用字符串资源文件(适合文本不是特别巨大的情况)

把你的词汇表内容放到res/values/strings.xml里,用<string>标签包裹,并且如果文本包含换行、特殊字符(比如<>),一定要用<![CDATA[]]>来包裹内容,避免XML解析错误:

<!-- res/values/strings.xml -->
<string name="glossary">
    <![CDATA[
    词汇1:解释内容
    词汇2:解释内容
    ...
    第5000个词汇:解释内容
    ]]>
</string>

然后在你的fragment_glossary.xml的TextView里引用这个字符串资源:

<TextView
    android:id="@+id/glossary_textview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/glossary"
    android:scrollbars="vertical"/> <!-- 加上滚动条方便查看长文本 -->

最后在Fragment的代码里开启滚动功能(否则TextView不会允许滚动):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_glossary, container, false);
    TextView glossaryTv = view.findViewById(R.id.glossary_textview);
    glossaryTv.setMovementMethod(new ScrollingMovementMethod());
    return view;
}

方案2:使用raw资源文件(适合超大规模文本,比如几MB的内容)

如果你的词汇表特别大,字符串资源可能也会有加载问题,这时候可以把文本放到res/raw目录下:

  1. res目录下创建raw文件夹(如果没有的话)
  2. 新建一个glossary.txt文件,把你的5000行词汇表内容粘贴进去
  3. 在Fragment的代码里读取这个文件并设置到TextView:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_glossary, container, false);
    TextView glossaryTv = view.findViewById(R.id.glossary_textview);
    
    try {
        // 读取raw目录下的文件
        InputStream inputStream = getResources().openRawResource(R.raw.glossary);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder contentBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            contentBuilder.append(line).append("\n");
        }
        // 关闭流
        reader.close();
        inputStream.close();
        // 设置文本
        glossaryTv.setText(contentBuilder.toString());
        // 开启滚动
        glossaryTv.setMovementMethod(new ScrollingMovementMethod());
    } catch (IOException e) {
        e.printStackTrace();
        glossaryTv.setText("加载词汇表失败");
    }
    
    return view;
}

布局里的TextView同样可以加上android:scrollbars="vertical"来显示滚动条。

这样处理后,你的5000行词汇表就能正常显示啦!

内容的提问来源于stack exchange,提问作者rairkz

火山引擎 最新活动