【问题标题】:Android: Converting XML android:background to Java Program Code [duplicate]Android:将 XML android:background 转换为 Java 程序代码 [重复]
【发布时间】:2014-05-13 09:23:30
【问题描述】:

我在一个包含这样的 TextView 的 XML 中创建了一个 RelativeLayout:

<TextView
    android:id="@+id/textView5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView3"
    android:layout_below="@+id/button1"
    android:layout_marginTop="28dp"
    android:background="@drawable/rounded_edges"
    android:textSize="25sp" />

以便在文本下方绘制一个圆圈。 rounded_edges.xml 定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval">
    <corners android:radius="10dip"/>
    <stroke android:color="#c00000" android:width="2dip"/>
    <solid android:color="#ffffff"/>
</shape>

然后我需要更多的文本视图,具体取决于用户输入的数字。每个 textView 都会在下方显示一个带有圆圈的数字。我成功地在 Java 代码中以编程方式创建了 textViews,如下所示,除了圆圈:

final TextView textView5 = (TextView) findViewById(R.id.textView5);

// size stores the number entered by user
RelativeLayout myLayout =  (RelativeLayout)findViewById(R.id.layout1);

// Creating a new TextView
TextView[] tv = new TextView[size+1];
TextView temptv;

for (i = 1; i <= size; i++) {
    temptv = new TextView(MainActivity.this);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

    if (i > 1) {
        lp.addRule(RelativeLayout.BELOW, R.id.textView5);
        lp.addRule(RelativeLayout.RIGHT_OF, tv[i-1].getId());
    }
    else {
        lp.addRule(RelativeLayout.BELOW, R.id.textView5);
        lp.addRule(RelativeLayout.ALIGN_LEFT, R.id.textView5);
    }

    // width of Text
    temptv.setWidth(50);
    // size of Text
    temptv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);

    temptv.setLayoutParams(lp);
    myLayout.addView(temptv, lp);

    answer = "<font color='#8000ff'>" + mynum[i] + "</font>";
    answer = answer + "&nbsp;&nbsp;&nbsp;";

    // Update the label with our dynamic answer
    temptv.setText(Html.fromHtml(answer));
    tv[i] = temptv;
    tv[i].setId(i);

}
setContentView(myLayout);

有没有办法将android:background="@drawable/rounded_edges" 转换为Java 代码,以便我仍然可以使用rounded_edges.xml 来绘制圆圈?还是我必须在 Java 中完全从头开始绘制?

【问题讨论】:

    标签: java android xml drawing android-relativelayout


    【解决方案1】:

    你可以设置 textView 背景为 txt.setBackgroundResources(); 或者试试这个 这不是您正在寻找的确切内容,但我可以说它会帮助您找到解决方案。

     private int xCord, yCord ;
     private final Paint dotPaint  = new Paint();
       private void init()
     {
      dotPaint.setAntiAlias(true);    
      dotPaint.setStyle(Paint.Style.FILL);
      dotPaint.setColor(Color.parseColor("#FFAC4A70"));// Change color as per Ur...
     }
     private static final int DOT_RADIUS = 16;//change it as per requirement
     protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    
        if(isEventCell)
        {
             xCord = getWidth() / 2;
             yCord = getHeight() - DOT_RADIUS - 8;   
            canvas.drawCircle(xCord , yCord,DOT_RADIUS , dotPaint);
        }
    
    
    
    }
    

    然后尝试调用 init();在你的 textVies 所在的方法构造函数中......

        public class CalendarCellView extends TextView {
    
    private final Paint dotPaint  = new Paint();
    private boolean isEventCell ;
    private int xCord, yCord ;
    private static final int DOT_RADIUS = 16;
    
    
     private static final int[] STATE_SELECTABLE = {
      R.attr.state_selectable
     };
     private static final int[] STATE_CURRENT_MONTH = {
      R.attr.state_current_month
     };
    private static final int[] STATE_TODAY = {
      R.attr.state_today
     };
     private static final int[] STATE_RANGE_FIRST = {
      R.attr.state_range_first
     };
     private static final int[] STATE_RANGE_MIDDLE = {
      R.attr.state_range_middle
     };
     private static final int[] STATE_RANGE_LAST = {
      R.attr.state_range_last
     };
    
     private boolean isSelectable = false;
      private boolean isCurrentMonth = false;
    private boolean isToday = false;
     private RangeState rangeState = RangeState.NONE;
    
    public CalendarCellView(Context context) {
    super(context);
    init();
     }
    
      public CalendarCellView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
     }
    
     public CalendarCellView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
     }
    
      public void setSelectable(boolean isSelectable) {
       this.isSelectable = isSelectable;
       refreshDrawableState();
      }
    
     private void init()
     {
      dotPaint.setAntiAlias(true);    
      dotPaint.setStyle(Paint.Style.FILL);
      dotPaint.setColor(Color.parseColor("#FFAC4A70"));//("#FFAC4A70"));
      }
    
      public void setCurrentMonth(boolean isCurrentMonth) {
    this.isCurrentMonth = isCurrentMonth;
    refreshDrawableState();
     }
    
     public void setToday(boolean isToday) {
    this.isToday = isToday;
    refreshDrawableState();
     }
    
     public void setRangeState(MonthCellDescriptor.RangeState rangeState) {
       this.rangeState = rangeState;
       refreshDrawableState();
     }
    
     public void isEventCell(boolean isEventCell)
     {
      this.isEventCell = isEventCell;
     }
    
     @Override protected int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 4);
    
    if (isSelectable) {
      mergeDrawableStates(drawableState, STATE_SELECTABLE);
    }
    
    if (isCurrentMonth) {
      mergeDrawableStates(drawableState, STATE_CURRENT_MONTH);
      }
    
      if (isToday) {
       mergeDrawableStates(drawableState, STATE_TODAY);
      }
    
    if (rangeState == MonthCellDescriptor.RangeState.FIRST) {
      mergeDrawableStates(drawableState, STATE_RANGE_FIRST);
      } else if (rangeState == MonthCellDescriptor.RangeState.MIDDLE) {
        mergeDrawableStates(drawableState, STATE_RANGE_MIDDLE);
         } else if (rangeState == RangeState.LAST) {
        mergeDrawableStates(drawableState, STATE_RANGE_LAST);
         }
         return drawableState;
       }
    
       @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    
        if(isEventCell)
        {
             xCord = getWidth() / 2;
             yCord = getHeight() - DOT_RADIUS - 8;   
            canvas.drawCircle(xCord , yCord,DOT_RADIUS , dotPaint);
          }
    
    
    
        }
    
    
    
          }
    

    【讨论】:

    • 感谢您的选择。对不起,如果这是一个愚蠢的问题,但我如何创建 Canvas 对象以使用onDraw()?我对 Android 应用程序开发非常陌生,并且很长时间没有接触 Java。
    • 对不起,我也是安卓新手。我认为不需要在 OnDraw(Canvas canvas) 方法中创建 Canvas 对象。只需尝试调用 init();在您的 TextView 所在的类的构造函数中。我认为它会起作用
    • 如果你想要我的代码然后看看这个..你可能会得到一些提示......交叉检查我用我的代码编辑过的答案......
    • 请记住,问题不能是愚蠢的..
    • 你是对的。经过一番搜索,我发现了这个:(compiletimeerror.com/2013/09/…),和你代码的概念差不多。
    【解决方案2】:

    您可以在tv[i] = temptv;之前添加此代码

    temptv.setText(Html.fromHtml(answer));
    temptv.setBackgroundResource(R.drawable.rounded_edges);
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      试试这个

      Drawable dr = getResources().getDrawable(R.drawable.rounded_edges);
      temptv.setBackground(dr);
      

      【讨论】:

        【解决方案4】:

        有方法setBackgroundResource。要找出 xml 属性的类似物,只需查看documentation,您可以在其中找到 XML 属性表:

        android:background > setBackgroundResource(int) > 用作背景的可绘制对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-22
          • 2012-04-10
          • 1970-01-01
          • 1970-01-01
          • 2014-05-14
          相关资源
          最近更新 更多