安卓 - 编程设置 LayoutParams

74

我正在将一个游戏内聊天模块加入应用中。我将接收到的文本消息添加到 LinearLayout 视图中。我想为 TextView 设置布局参数,但以下代码会导致崩溃,而错误信息又令我困惑。

private void addChat(String chat, String when,  Boolean mine) {
    int leftMargin;

    TextView tv = new TextView(this);
    llview.addView(tv);
    tv.setTextColor(Color.WHITE);
    tv.setTextSize(2,25);
    tv.setText(chat);
    if (mine) {
        leftMargin = 5;
        tv.setBackgroundColor(0x7C5B77);
    }
    else {
        leftMargin = 50;
        tv.setBackgroundColor(0x778F6E);
    }
    final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)tv.getLayoutParams();
    lpt.setMargins(leftMargin,lpt.topMargin,lpt.rightMargin,lpt.bottomMargin);

    tv.setLayoutParams(new ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));

}

代码运行时,所有上述代码都会执行,但在Android运行时崩溃,错误提示为:

03-13 14:15:38.513: E/AndroidRuntime(12985): java.lang.ClassCastException:      android.view.ViewGroup$LayoutParams

通过调试器逐步执行,它实际上会处理所有这些行

但当尝试使用同样神秘的异常详细消息进行渲染时,它会发出错误信息。

android.view.ViewGroup$LayoutParams

那么,我需要做什么才能达到这种状态?我应该怎么做才能获得交替的左/右缩进消息?

5个回答

137

只需从底部开始替换,然后添加此内容

tv.setLayoutParams(new ViewGroup.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT,
    ViewGroup.LayoutParams.WRAP_CONTENT));

之前

llview.addView(tv);

1
如何将setLayoutParams设置为“dp”值而不是“wrap_content”或“match_parent”。我想将其每个设置为“100dp”。 - Sagar Balyan
我有完全相同的问题,找不到解决方案。 - Prabhakar
@SagarBalyan 请查看 https://dev59.com/Mmkw5IYBdhLWcg3wu9Jh#58154612 - M Karimi
@Prabhakar 看这个:https://dev59.com/Mmkw5IYBdhLWcg3wu9Jh#58154612 - M Karimi
/* 在 DP 中 */ ViewGroup.LayoutParams prm = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ); prm.height = 200; prm.width = 200; pieChart.setLayoutParams(prm); - garish
为什么我们要在TextView中使用ViewGroup? - Rawnak Yazdani

32

创建视图后,我们需要添加布局参数。

像这样进行更改

TextView tv = new TextView(this);
tv.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT));

llview.addView(tv);
tv.setTextColor(Color.WHITE);
tv.setTextSize(2,25);
tv.setText(chat);
if (mine) {
    leftMargin = 5;
    tv.setBackgroundColor(0x7C5B77);
}
else {
    leftMargin = 50;
    tv.setBackgroundColor(0x778F6E);
}
final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)tv.getLayoutParams();
lpt.setMargins(leftMargin,lpt.topMargin,lpt.rightMargin,lpt.bottomMargin);

5
lpt.setMargins(..)似乎没有任何效果。无论我将其设置为2还是20,都看起来完全相同。我根本看不到为边距创建的空间。我尝试了LinearLayout而不是TextView - faizal
4
在执行lpt.setMargins()请求之后,使用tv.setLayoutParams(lpt)设置布局参数。 - worked
如何将setLayoutParams设置为“dp”值而不是“wrap_content”或“match_parent”。我想将其每个设置为“100dp”。 - Sagar Balyan
你可以尝试这样做:float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, {widthInDp}, r.getDisplayMetrics());float height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, {heightInDp}, r.getDisplayMetrics());mChart.setLayoutParams(new ViewGroup.LayoutParams( width, height)); - RajaReddy PolamReddy
很确定那个转换会抛出异常。 - Barry Fruitman

5
  LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
                   /*width*/ ViewGroup.LayoutParams.MATCH_PARENT,
                   /*height*/ ViewGroup.LayoutParams.MATCH_PARENT,
                   /*weight*/ 1.0f
            );
            YOUR_VIEW.setLayoutParams(param);

你为什么使用了 LinearLayoutViewGroup - Rawnak Yazdani

5
int dp1 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
            context.getResources().getDisplayMetrics());

tv.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
dp1 * 100)); // if you want to set layout height to 100dp

llview.addView(tv);

0

Xamarin Android 对齐到对象的左侧

int dp24 = (int)TypedValue.ApplyDimension( ComplexUnitType.Dip, 24, Resources.System.DisplayMetrics );
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( dp24, dp24 );
            lp.AddRule( LayoutRules.CenterInParent, 1 );
            lp.AddRule( LayoutRules.LeftOf, //Id of the field Eg m_Button.Id ); 
            m_Button.LayoutParameters = lp;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接