2016-02-16 3 views
0

Я пытаюсь добавить LinearLayout для каждого элемента в переменном массиве. Мне нужно, чтобы каждый элемент имел изображение и текст по горизонтали, но пока я тестирую текст.Программно добавить 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); 

     } 
    } 

Там нет ошибок, данные как раз не заполнять на экране. Я пробовал случайный текст Hardcoding в setText(), но без успеха.

Спасибо

+1

Вы добавляете paymentOptionLayout в макет после этого для цикла? – Luksprog

+0

Я не знаю, почему я не думал об этом изначально, но RecyclerView был бы лучше для этого, меньше накладных расходов. Поэтому я собираюсь изучить это скорее. Спасибо за вопрос, хотя @Luksprog – x10sion

ответ

1

Вы не добавляете свой платежOptionLayout в макет, который установлен как ваш контент. В основном то, что вы делаете, является программным образом созданием макета, но затем ничего не делает с ним.

По умолчанию файл 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, который является доступным макетом в андроиде. Я думаю, вам стоит взглянуть на это.

0

getContext() является методом класса активности. Он возвращает контекстное представление только для текущей активности.

Для фрагмента либо передать экземпляр текущего класса активности с помощью constructor или использовать getActivity() метод или this вместо getContext()

Смотрите здесь для помощи

  1. Using context in a fragment

  2. How to add view into LinearLayout of Fragment by onClick?

Также добавьте paymentOptionLayout в представление родительского макета сразу после for loop.

Смежные вопросы