2016-03-22 2 views
0

Этот вид должен делать кнопку для каждого LinearLayout внутри себя и помещать LinearLayout внутри ScrollView. Я думаю, проблема в том, что LinearLayouts еще не существует, поскольку они созданы ПОСЛЕ инициализации этого представления. Поэтому getChildCound() возвращает ноль. Вы можете обойти это, жестко кодируя количество кнопок или получая их из атрибута XML, но вы не можете поместить LinearLayouts в ScrollViews, когда LinearLayouts отсутствует. Есть ли способ обойти это?Чтение детей View во время инициализации View

код:

package mika.actual; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Color; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.ScrollView; 

import java.util.ArrayList; 


public class AccordionWidget extends LinearLayout{ 

    public AccordionWidget(Context c, AttributeSet attrs) { 
     super(c, attrs); 

     final Context context = c; 

     final int count = this.getChildCount(); 

     TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.accordion); 
     String[] btns = getResources().getStringArray(R.array.buttons); 
     ArrayList<LinearLayout> lls = new ArrayList <> (count); 

     for(int i = 0; i < count; i++){ 
      View child = this.getChildAt(i); 
      if (child instanceof LinearLayout) { 
       lls.add((LinearLayout)child); 
      } 
     } 

     for(int i = 0; i < lls.size(); i++){ 

      if(btns[i] == null){ 
       Log.e("error: ", "Please add more Button lables to the strings.xml file."); 
      } 

      final Button btn = new Button(context); 
      final LinearLayout ll = lls.get(i); 
      final ScrollView sv = new ScrollView(context); 
      final int col_pressed = a.getColor(R.styleable.accordion_backgroundColorPressed, Color.BLACK); 
      final int col_unpressed = a.getColor(R.styleable.accordion_backgroundColorUnpressed, Color.YELLOW); //Black and yellow, black and yellow... 


      LayoutParams btnparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
      LayoutParams swparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
      LayoutParams llparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
      btn.setText(btns[i]); 
      btn.setBackgroundColor(col_pressed); 
      llparams.weight = 1f; 

      btn.setLayoutParams(btnparams); 
      ll.setLayoutParams(llparams); 
      sv.setLayoutParams(swparams); 
      ll.setOrientation(LinearLayout.VERTICAL); 
      sv.setVisibility(View.GONE); 

      this.addView(sv); 
      this.addView(btn); 
      sv.addView(ll); 

      btn.setOnClickListener(new OnClickListener() { 
       private boolean btnstate = false; 
       @Override 
       public void onClick(View v) { 
        if (btnstate) { 
         btn.setBackgroundColor(col_pressed); 
         sv.setVisibility(View.VISIBLE); 
         btnstate = true; 
        } else { 
         btn.setBackgroundColor(col_unpressed); 
         sv.setVisibility(View.GONE); 
         btnstate = false; 
        } 
       } 
      }); 
     } 
     a.recycle(); 
    } 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<mika.actual.AccordionWidget 
    xmlns:accordion="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    accordion:text_color="@color/text_color" 
    accordion:backgroundColorPressed="@color/button_pressed" 
    accordion:backgroundColorUnpressed="@color/button_not_pressed" 
    android:id="@+id/swaggy" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="yolooooo yooo"/> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="yolooooo yooo"/> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="yolooooo yooo"/> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="yolooooo yooo"/> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="yolooooo yooo"/> 

    </LinearLayout> 

</mika.actual.AccordionWidget> 
+0

Попробуйте эту http://javatechig.com/android/how-to-create-custom-layout-in-android-by-extending-viewgroup-class –

+0

Используйте OnLayout методу –

+0

@KonstantinsBogdanovs I действительно не понимаю, что находится на сайте. Я новичок в андроиде. – lenny

ответ

1

Идея заключается в том, что вам нужно поместить вашу логику в onLayout что-то вроде этого:

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
final Context context = c; 

    final int count = this.getChildCount(); 

    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.accordion); 
    String[] btns = getResources().getStringArray(R.array.buttons); 
    ArrayList<LinearLayout> lls = new ArrayList <> (count); 

    for(int i = 0; i < count; i++){ 
     View child = this.getChildAt(i); 
     if (child instanceof LinearLayout) { 
      lls.add((LinearLayout)child); 
     } 
    } 
....... 

См this

Убедитесь, что вы вызываете child.layout() для каждого ребенка внутри этого метода.

+0

Что делает 'child.layout()' do? – lenny

+0

От http://developer.android.com/intl/ru/reference/android/view/ViewGroup.html –

+0

Он помещает ребенка в ViewGroup –

0

Вы можете создавать пользовательские LinearLayout внутри ScrollView:

<ScrollView> 
    <LinearLayout android:id="@+id/parent"/> 
</ScrollView> 

Затем создать класс Java для компоновки и надуть его.

См this

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