【问题标题】:android - setting LayoutParams programmaticallyandroid - 以编程方式设置 LayoutParams
【发布时间】:2012-03-13 05:23:13
【问题描述】:

我将游戏内聊天模块放入应用中。我正在将收到的文本消息添加到 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

那么,为了达到这个状态做了什么?我应该怎么做才能交替左/右缩进消息?

【问题讨论】:

    标签: android


    【解决方案1】:

    只需从底部替换并添加此

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

    之前

    llview.addView(tv);
    

    【讨论】:

    • 如何在dp 值而不是wrap_contentmatch_parent 中设置LayoutParams。我想将其设置为100dp each。
    • 我有完全相同的问题,找不到解决方案。
    • @Prabhakar 看看这个:stackoverflow.com/a/58154612/11675817
    • /*在 DP */ ViewGroup.LayoutParams prm = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); prm.height=200; prm.宽度=200; pieChart.setLayoutParams(prm);
    【解决方案2】:

    创建视图后,我们必须添加布局参数。

    这样改

    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);
    

    【讨论】:

    • lpt.setMargins(..) 似乎没有任何效果。无论我将其设置为 2 还是 20,它看起来都完全相同。我根本看不到为边距创建空间。我试过LinearLayout,而不是TextView
    • ^ tv.setLayoutParams(lpt) 在 lpt.setMargins() 请求之后
    • 如何在dp 值而不是wrap_contentmatch_parent 中设置LayoutParams。我想将其设置为100dp each。
    • 你可以这样尝试:float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, {widthInDp}, r.getDisplayMetrics());浮动高度 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, {heightInDp}, r.getDisplayMetrics()); mChart.setLayoutParams(new ViewGroup.LayoutParams(width, height));
    • 相当肯定演员会抛出异常
    【解决方案3】:
    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);
    

    【讨论】:

      【解决方案4】:
        LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
                         /*width*/ ViewGroup.LayoutParams.MATCH_PARENT,
                         /*height*/ ViewGroup.LayoutParams.MATCH_PARENT,
                         /*weight*/ 1.0f
                  );
                  YOUR_VIEW.setLayoutParams(param);
      

      【讨论】:

      • 你为什么使用LinearLayoutViewGroup
      【解决方案5】:

      对于 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 2011-04-28
        • 2015-05-29
        • 2011-12-16
        • 2013-10-31
        相关资源
        最近更新 更多