Добавление TextViews внутри горизонтального LinearLayout динамически - PullRequest
0 голосов
/ 25 января 2019

Нажмите здесь, чтобы увидеть изображение

На странице профиля моей заявки я хочу иметь раздел интересов, как показано на рисунке.У пользователя есть список интересов под своим профилем.Я хочу показать его / ее интересы в горизонтальной LinearLayout.Я создал массив TextViews и добавил их динамически в родительский LinearLayout, но я не хочу добавлять TextViews, когда места больше нет.Вместо этого я хочу добавить TextView, показывающий количество оставшихся интересов.

Как показано на рисунке (используйте ссылку на изображение), у пользователя было 24 интереса, 4 из которых уместились горизонтально на одной строке и последнийTextView (+20) показывает количество оставшихся интересов в той же строке.

String interestList[]={"Travel","Music","Photography","Sports","Dance","Animals","SciFi Movies"};
    int interestWidth =0, parentWidth=interestLinearLayout.getWidth();
    for(String interest: interestList) {
        TextView textView = new TextView(MainActivity.this);
        textView.setBackground(getResources().getDrawable(R.drawable.interests_bg));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.setMargins(2,0,10,2);
        textView.setLayoutParams(params);
        textView.setPadding(2, 2, 2, 2);
        textView.setText(" "+interest+" ");
        textView.setTextColor(getResources().getColor(R.color.white));
        textView.setIncludeFontPadding(true);
        interestWidth += textView.getWidth();
        if(interestWidth<parentWidth) //both are 0 on first iteration of loop???
            interestLinearLayout.addView(textView);
        else
            break;
    }

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Чтобы создать LinearLayout,

LinearLayout layout = new LinearLayout(MainActivity.this);

Чтобы установить цвет фона макета,

layout.setBackgroundColor(Color.parseColor("#135517"));

Чтобы установить ширину и высоту макета,

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(15, 5, 5, 5);
layout.setLayoutParams(params);

Ориентация,

layout.setOrientation(LinearLayout.HORIZONTAL);          
layout.setHorizontalGravity(Gravity.CENTER_HORIZONTAL);
layout.setPadding(10, 10, 5, 5);

Затем создайте текстовое представление,

    TextView textView = new TextView(this);
textView.setLayoutParams(params);
        textView.setPadding(2, 2, 2, 2);
        textView.setText(" "your" ");
        textView.setTextColor(getResources().getColor(R.color.white));
        textView.setIncludeFontPadding(true);

Добавить представление к родителю,

layout.addView(textView);
0 голосов
/ 10 августа 2019

InterestWidth и parentWidth изначально равны 0, поскольку они не были размечены при вызове getWidth.

получить ширину для динамически создаваемых текстовых представлений

Помогла приведенная выше ссылкая получаю ширину динамически создаваемых текстовых представлений из InterestList.

И, используя ViewTreeObserver для интереса LineararLayout, я смог получить ширину LinearLayout после того, как он был выложен.

Наконец, приведенный выше код должен бытьизменено, как показано ниже, чтобы добавить textViews из JAVA внутри LinearLayout.

       final LinearLayout interestLinearLayout = findViewById(R.id.interests);
       interestLinearLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                interestLinearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                String interestList[]={"Travel","Music","Photography","Sports","Dance","Animals","SciFi Movies"};
                int interestWidth =0;
                int parentWidth = interestLinearLayout.getWidth(); // got width inside view tree observer for linearlayout
                for(String interest: interestList) {
                    TextView textView = new TextView(MainActivity.this);
                    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                    params.setMargins(2,0,10,2);
                    textView.setLayoutParams(params);
                    textView.setPadding(2, 2, 2, 2);
                    textView.setText(interest);
                    textView.setIncludeFontPadding(true);
                    textView.measure(0,0); //using approach mentioned in link to get width of text views
                    interestWidth += textView.getMeasuredWidth(); 
                    if(interestWidth<parentWidth)
                        interestLinearLayout.addView(textView);
                    else
                        break;
                }
            }
        });
0 голосов
/ 25 января 2019

Вы можете добавлять представления динамически, но сначала вам нужна ссылка на родительское представление, к которому вы хотите добавить представление.

Вы можете сделать это, просто используя findViewById. Предполагая, что это линейное расположение,

LinearLayout parent = findViewById(R.id.parent);
// Then create a textview
TextView textView = new TextView(this);
// Add the view to the parent
parent.addView(textView);

И это все! Чтобы изменить свойства TextView, вы можете использовать методы получения и установки TextView. Если вы хотите изменить поля, отступы или высоту ширины TextView, используйте LayoutParams

// Remember that I'm using LinearLayout.LayoutParams because  the parent of the ttextview is a  LinearLayout
LinearLayout.LayourParams params = textView.getLayoutParams();
// Remember these values are in pixels
params.height = 100;
params.width = 200;

Существует множество проблем с использованием этого метода, например, установка высоты и ширины в пикселях вместо dps. И писать много кода, когда вы могли бы сделать это в XML. Однако вы можете сделать это намного проще, создав XML-файл в вашем res / layout, а затем накачав его и, наконец, добавив его к родительскому элементу.

Вы можете сделать это с помощью -

// First get the layout inflater
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView textView = inflater.inflate(R.layout.myTextView, null);
linearLayout.addView(textView);

Наконец, мы решили проблему с добавлением достаточного количества представлений, чтобы linearLayout не выходил за пределы ширины экрана.

Самое простое решение - циклически проходить по списку интересов и на каждой итерации цикла измерять общую ширину созданных TextViews, а затем проверять, превышает ли она ширину linearLayout.

Это будет выглядеть примерно так -

int combinedWidth = 0;
int linearLayoutWidth = linearLayout.getMeasuredWidth();
for(String interest : interests){
    TextView view = inflater.inflate(R.layout.textview, null);
    combinedWidth += textView.getMeasuredWidth();
    view.setText(interest);
    if(combinedWidth > linearLayoutWidth){
        // No need to add more views
        break;
    }else{
        linearLayout.addView(textView);
    }
}

Однако приведенное выше решение может работать или не работать в зависимости от того, когда оно выполнено. Поэтому опубликуйте код активности вместе с файлом xml, чтобы я мог лучше ответить на ваш вопрос.

...