java - Android:将 XML android:background 转换为 Java 程序代码

标签 java android xml drawing android-relativelayout

<分区>

我在包含 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,具体取决于用户输入的数字。每个 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 从头开始​​绘制它?

最佳答案

您可以将 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);
      }



    }



      }

关于java - Android:将 XML android:background 转换为 Java 程序代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23627372/

相关文章:

java - 如何获取 ArrayList 的最后一个值

java - Firebase 身份验证对象在 fragment 中崩溃

java - 仅从自定义数组列表中获取字符串并使用字符串创建字符串数组

c# - 从 XML 中读取数据

java - 忽略了 Spring 安全身份验证过滤器 url

java - 具有 Java 相对路径的 MS Access 数据库

java - 手动下载的android obb文件,通过Play Store更新应用程序后删除

android - 未处理的IO异常?使用媒体播放器播放mp3文件-Android

java - 多重 xslt 转换

java - 如何将解析后的 XML 显示到 ListView