以编程方式Android的TextView

Posted

技术标签:

【中文标题】以编程方式Android的TextView【英文标题】:TextView programmatically Android 【发布时间】:2014-06-02 08:58:06 【问题描述】:

我在以编程方式创建 textView 时遇到了一些问题。真不知道怎么解决。

问题是:

-边距,我不希望我的 TextView 粘在一起。

-文本不像标题那样在drawable中居中

-我希望昵称用户的消息向右对齐,尼克的消息向左对齐。

为此,我有这两个功能:

private void appendSenderText(String message) 

        TextView msg = new TextView(ChatActivity.this);
        msg.setBackgroundResource(R.drawable.rectangle);
        msg.setText(message);
        msg.setPadding(10, 10, 10, 10);
        msg.setTextColor(getResources().getColor(R.color.white));
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, Gravity.LEFT);
        params.setMargins(10, 10, 10, 10);
        msg.setLayoutParams(params);
        LinearLayout chat = (LinearLayout) findViewById(R.id.chatLayout);
        chat.addView(msg);  
    

    private void appendReceiverText(String message) 

        TextView msg = new TextView(ChatActivity.this);
        msg.setBackgroundResource(R.drawable.rectangle);
        msg.setText(message);
        msg.setPadding(10, 10, 10, 10);
        msg.setTextColor(getResources().getColor(R.color.white));
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, Gravity.RIGHT);
        params.setMargins(10, 10, 10, 10);
        msg.setLayoutParams(params);
        LinearLayout chat = (LinearLayout) findViewById(R.id.chatLayout);
        chat.addView(msg);  
    

它似乎不起作用。我还检查了这些函数是否被正确调用。 我注意到在标题的 XML 文件中,我指定了 layout_gravity 而不是重力。

编辑:我按照您的建议使用 ListView,一切正常,但我仍然遇到文本未居中的问题,尽管我使用了 msg.setGravity(gravity.CENTER); 也许我的drawable有问题。

这是我的圆角矩形的 xml 文件。这很奇怪,当我在 XML 文件中创建我的 Textview 时,文本是居中的,而当我想以编程方式创建时,情况并非如此。

这是我的drawable的代码。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <gradient
     android:startColor="@color/drk_button"
     android:endColor="@color/lgt_button"
     android:angle="90">
   </gradient>

   <corners android:radius="7dip" />

   <stroke
     android:
     android:color="@color/drk_button" />
</shape>

这里是我创建 texView 的代码。

Message message = (Message) this.getItem(position);

        ViewHolder holder; 
        if(convertView == null)
        
            holder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.sms_row, parent, false);
            holder.message = (TextView) convertView.findViewById(R.id.message_text);
            convertView.setTag(holder);
        
        else
            holder = (ViewHolder) convertView.getTag();

        holder.message.setText(message.getMessage());
        holder.message.setTextSize(17);
        holder.message.setGravity(Gravity.CENTER);
        LayoutParams lp = (LayoutParams) holder.message.getLayoutParams();
        if(message.isMine())
        
            holder.message.setBackgroundResource(R.drawable.rectangle);
            lp.gravity = Gravity.LEFT;
        
        else
        
            holder.message.setBackgroundResource(R.drawable.rectangledest);
            lp.gravity = Gravity.RIGHT;
        
        holder.message.setLayoutParams(lp);
        holder.message.setTextColor(Color.WHITE);   

        return convertView;
    

【问题讨论】:

你绝对应该使用 ListView 来处理类似聊天的事情 如果您正在开发聊天应用程序,最好使用ListView 并查看一些示例聊天应用程序代码。 github.com/AlexBarinov/UIBubbleTableView 【参考方案1】:

我更新了你的功能,它现在可以按你的意愿工作了:

private void appendSenderText(String message) 

    TextView msg = new TextView(ButtonsActivity.this);
    msg.setBackgroundResource(R.drawable.rectangle);
    msg.setText(message);
    msg.setPadding(10, 10, 10, 10);
    msg.setTextColor(getResources().getColor(R.color.white));
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
    params.setMargins(5, 15, 0, 0);
    params.gravity = Gravity.LEFT;
    msg.setLayoutParams(params);
    msg.setGravity(Gravity.CENTER);
    LinearLayout chat = (LinearLayout) findViewById(R.id.chatLayout);
    chat.addView(msg);  


private void appendReceiverText(String message) 

    TextView msg = new TextView(ButtonsActivity.this);
    msg.setBackgroundResource(R.drawable.rectangle);
    msg.setText(message);
    msg.setPadding(10, 10, 10, 10);
    msg.setTextColor(getResources().getColor(R.color.white));
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
    params.setMargins(0, 15, 5, 0);
    params.gravity = Gravity.RIGHT;
    msg.setLayoutParams(params);
    msg.setGravity(Gravity.CENTER);
    LinearLayout chat = (LinearLayout) findViewById(R.id.chatLayout);
    chat.addView(msg);  

您必须设置TextView 重力以将文本定位在TextView 内,并在父LinearLayout 中设置重力以将TextView 的位置设置在LinearLayout 内。

请注意,我使用的是 LinearLayout 而不是 FrameLayout

【讨论】:

【参考方案2】:

使用自定义列表视图填充聊天行。

要使聊天文本居中添加此行。

msg.setGravity(Gravity.CENTER);

我相信您的框架布局使文本视图彼此靠近。

我建议您使用带有自定义适配器的 ListView 来填充聊天行。在 ListViews 中添加聊天行和更新视图很容易。 check this link 。它会给你一个基本的想法。

【讨论】:

以上是关于以编程方式Android的TextView的主要内容,如果未能解决你的问题,请参考以下文章

Android 编程:如何以网格方式以编程方式创建各种视图类型

以编程方式设置 android:animateLayoutChanges

以编程方式打开 Android 设置

*** 以编程方式 android

以编程方式的Android按钮位置

如何以编程方式创建 android 形状背景?