使用文本和图像以编程方式添加LinearLayout

时间:2016-02-16 10:31:42

标签: java android

我尝试为变量数组中的每个项目添加LinearLayout。我需要每个项目都有水平的图像和文本,但现在我正在测试文本。

请记住此代码位于片段中。

我认为错误在于getContext()但不确定。

我目前的代码是:

List<PaymentOption> paymentOptions = aTradeItem.getPaymentOptions();

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
    lp.setMargins(ImageUtils.dpToPx(16), ImageUtils.dpToPx(4), ImageUtils.dpToPx(16), ImageUtils.dpToPx(4));

    LinearLayout.LayoutParams lineparams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ImageUtils.dpToPx(1));
    lineparams.setMargins(0, ImageUtils.dpToPx(4), 0, ImageUtils.dpToPx(4));

    if (paymentOptions != null && paymentOptions.size() > 0) {
      for (PaymentOption t : paymentOptions) {
        LinearLayout paymentOptionLayout = new LinearLayout(getContext());
        paymentOptionLayout.setOrientation(LinearLayout.HORIZONTAL);
        paymentOptionLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));

        TextView heading = new TextView(getContext());
        heading.setText(t.getDescription());
        heading.setTextColor(getResources().getColor(R.color.light_text));
        heading.setLayoutParams(lp);

        paymentOptionLayout.addView(heading);

      }
    }

没有错误,数据不会填充在屏幕上。我在setText()中尝试过硬编码随机文本,但没有成功。

谢谢

2 个答案:

答案 0 :(得分:1)

您未将paymentOptionLayout添加到设置为内容视图的布局中。基本上你正在做的是以编程方式创建布局,但随后不做任何事情。

默认情况下,您的activity_main.xml文件将带有某种类型的布局,具体取决于您设置代码的方式,例如空白活动的xml文件将是

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity"
android:id="@+id/RelativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

但是,当您以编程方式创建布局时,必须将它们附加到布局中,该布局是XML文件中的父布局。 所以我认为你需要做的是以下几点。

RelativeLayout rl=(RelativeLayout)findViewById(R.id.RelativeLayout); //getting the view from the xml file. Keep in mind that the id is defiend in the xml file by you
List<PaymentOption> paymentOptions = aTradeItem.getPaymentOptions();

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(ImageUtils.dpToPx(16), ImageUtils.dpToPx(4), ImageUtils.dpToPx(16), ImageUtils.dpToPx(4));

LinearLayout.LayoutParams lineparams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ImageUtils.dpToPx(1));
lineparams.setMargins(0, ImageUtils.dpToPx(4), 0, ImageUtils.dpToPx(4));

if (paymentOptions != null && paymentOptions.size() > 0) {
  for (PaymentOption t : paymentOptions) {
    LinearLayout paymentOptionLayout = new LinearLayout(getContext());
    paymentOptionLayout.setOrientation(LinearLayout.HORIZONTAL);
    paymentOptionLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));

    TextView heading = new TextView(getContext());
    heading.setText(t.getDescription());
    heading.setTextColor(getResources().getColor(R.color.light_text));
    heading.setLayoutParams(lp);

    paymentOptionLayout.addView(heading);
    rl.addView(paymentOptionLayout);  //adding the view to the parent view
  }
}

请注意,根据代码的外观,您实际上只是重新实现了listView,它是android中的可用布局。我想你应该看一下。

答案 1 :(得分:0)

getContext()是一种活动类方法。它仅返回当前正在运行的活动的上下文视图。

For Fragment要么通过constructor传递当前活动类的实例,要么使用getActivity()方法或this代替getContext()

请点击此处获取帮助

  1. $setDifference

  2. Using context in a fragment

  3. paymentOptionLayout之后立即将for loop添加到父版式视图。