0

我尝试创建一个自定义LinearLayout,它将像网格一样工作。我成功地这样做了,并有我想要的方面,但我仍然有问题。当我只有一行时。我想将我的自定义布局的layout_height属性从wrap_content更改为march_parent以便能够将将创建的唯一LinearLayout居中。Android自定义LinearLayout:getParams返回null

所以现在我我的代码是在onFinishInflate方法之后演技,但我在这里有一个问题,我不能得到的LayoutParams因为该值是空的,当我试图把我自己的新参数,可以是不工作:

setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

这里是我的代码:

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.Gravity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 

import java.util.ArrayList; 

public class GameGridLayout extends LinearLayout { 
    private Context context; 
    private int currentRow = -1, maxRowItems = 3; 
    private ArrayList<LinearLayout> layouts = new ArrayList<>(); 

    public GameGridLayout(Context context) { 
     super(context); 
     this.context = context; 
    } 

    public GameGridLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
    } 

    public GameGridLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     this.context = context; 
    } 

    private ArrayList<View> getViews() { 
     int nbChilds = getChildCount(); 
     ArrayList<View> views = new ArrayList<>(); 
     for (int i = 0; i < nbChilds; i++) { 
      views.add(getChildAt(i)); 
     } 
     return views; 
    } 

    private void reorganizeViews(Context context) { 
     ArrayList<View> views = getViews(); 
     if(views.size() == 4) maxRowItems = 2; 

     for (int i = 0; i < views.size(); i++) { 
      if(i % maxRowItems == 0) { 
       LinearLayout currentLayout = new LinearLayout(context); 
       layouts.add(currentLayout); 
       currentRow++; 
      } 
      View currentChild = views.get(i); 
      if(currentChild != null) { 
       removeView(currentChild); 
       layouts.get(currentRow).addView(currentChild); 
      } 
     } 

     for (int i = 0; i < layouts.size(); i++) { 
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
      layouts.get(i).setLayoutParams(params); 
      layouts.get(i).setOrientation(HORIZONTAL); 
      layouts.get(i).setWeightSum(3); 
      layouts.get(i).setGravity(Gravity.CENTER); 

      addView(layouts.get(i)); 
     } 

     setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     reorganizeViews(context); 
    } 
} 

如果你知道是谁做的,我看到,如果我用的是充气的方法,我也许可以有我想要的结果,但我不不知道该怎么做,例如:

inflate(context, ??, this); 

我没有任何XML膨胀,所以...

回答

0

拨打onFinishInflatesetLayoutParams实际并不起作用,因为当它被添加到您的GameGridLayoutLayoutParams将被覆盖其父母以后。

我建议你在GameGridLayout之后将它添加到父项中,然后调用setLayoutParams

+0

是的,我完成了这样做,只是创建一个简单的方法setLayoutParams和我的onCreate我调用该方法。它的优点是很容易^ _ ^。谢谢 – zed13