【问题标题】:Android: Having trouble with newline in TextView inside BaseAdapterAndroid:在 BaseAdapter 内的 TextView 中出现换行问题
【发布时间】:2014-12-23 09:03:47
【问题描述】:

基本上,我在 mysql db 中插入文本和换行符,如下所示:

$message = 'Hello World' . "\n";
$message .= 'This is a test' . "\n";
$message .= 'Thanks;

在数据库中保存消息时,我尝试将新行的值设置为\n\\n\\\n\\\\n 甚至<br> 而不是\n 然后在android 上使用fromHtml应用程序,但没有任何效果。

在 db 中,我可以看到有新行。

在 Android 应用程序上,如果 TextView 中显示任何换行符,我希望有换行符,我尝试了各种方法,但没有任何效果,我尝试过以下操作:

String message = m.getMessage().toString();
  message = message.replaceAll("\\n",
      System.getProperty("line.separator"));

这里不是"\\n",我也试过"\\\n""\n"甚至"\\\\n"

还有:

Spanned html = Html.fromHtml(m.getMessage());

还有:

message.replaceAll("\n","<br />");
message.replaceAll("\r\n","<br />");
message.replaceAll("\r","<br />");

还有:

android:singleLine="false"

尝试了各种方法后,在 TextView 中,我得到了如下排列的文本:

Hello WorldThis is a testThanks

Hello World\This is a test\Thanks

Hello World\nThis is a test\nThanks

这是我的完整代码:

public class MessageListAdapter extends BaseAdapter {

    private Context context;
    private List<ListMessage> messagesItems;

    public MessageListAdapter(Context context, List<ListMessage> navDrawerItems) {
        this.context = context;
        this.messagesItems = navDrawerItems;
    }

    @Override
    public int getCount() {
        return messagesItems.size();
    }

    @Override
    public Object getItem(int position) {
        return messagesItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @SuppressLint("InflateParams")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        /**
         * The following list not implemented reusable list items as list items
         * are showing incorrect data Add the solution if you have one
         * */

        ListMessage m = messagesItems.get(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        // Identifying the message owner
        if (messagesItems.get(position).isSelf()) {
            // message belongs to you, so load the right aligned layout
            convertView = mInflater.inflate(R.layout.list_item_message_right,
                    null);
        } else {
            // message belongs to other person, load the left aligned layout
            convertView = mInflater.inflate(R.layout.list_item_message_left,
                    null);
        }

        TextView lblFrom = (TextView) convertView
                .findViewById(R.id.lblMsgFromListMessage);
        TextView lblTo = (TextView) convertView
                .findViewById(R.id.lblMsgToListMessage);

        lblFrom.setText(m.getFromName());

        // Spanned html = Html.fromHtml(m.getMessage());
        // String message = html.toString();

        String message = m.getMessage().toString();
        message = message.replaceAll("\\n",
                System.getProperty("line.separator"));

        try {
            lblTo.setText(message);

        } catch (Exception e) {
            lblTo.setText(message);
        }

        return convertView;
    }
}

布局中的TextView:

<TextView
    android:id="@+id/lblMsgToListMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="50dp"
    android:background="@drawable/chat_bg_msg_from"
    android:paddingBottom="@dimen/five_dp"
    android:paddingLeft="@dimen/ten_dp"
    android:paddingRight="@dimen/ten_dp"
    android:paddingTop="@dimen/five_dp"
    android:textColor="@color/chat_title_gray"
    android:textSize="@dimen/eighteen_sp" />

baseAdaptor 有问题吗?我在某处看到this link,它建议SimpleAdapter 设置html 有问题,但就我而言,这也无济于事,因为我使用的是BaseAdapter

非常感谢您的帮助,因为我在这个新问题上浪费了五个小时:(

【问题讨论】:

  • 尝试将 \r 与 \n 作为 \n\r

标签: android textview newline baseadapter


【解决方案1】:

试试:

message = message.replaceAll("\\n", "&amp;#10;");

或(仅当输入中确实有双反斜杠时)

message = message.replaceAll("\\n", "&amp;#10;");


更新:替换不起作用,因为搜索字符串 (\n) 已被 sql 数据库剥离(转义)。 This answer 提供了一种解决方法,包括在将字符串设置到 TextView 之前先在字符串上运行 unescape

【讨论】:

  • 没用。我在数据库中发送了\n。从 php 保存到 db 时是否需要更改为 \\n\\\n
  • 在替换调用之前打印消息字符串,以便我们可以看到传入的内容。
  • 在命令的搜索端,您可能需要使用 Unicode/HTML 值而不是直接斜杠符号 (unicode-table.com/en/#005C),但首先要查看传入的字符串如何打印。
  • 12-23 14:31:16.259: I/MessageLOG(1957): Hey, Welcome to App - Android for World. Enjoy :)
  • 在 db 中,我看到行拆分为新行,但 log cat 显示像这样的一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多