Horizo​​ntalScrollView.getMeasuredWidth()返回0

时间:2013-12-27 23:07:19

标签: android horizontalscrollview

我以编程方式添加horizo​​ntalScrollView,但是当我尝试使用horizo​​ntalScrollView.getMeasuredWidth()时,它会一直返回0.

void addCategory(String catTitle) {
    mVideos = mShows.get(catTitle);
    LinearLayout theLayout = (LinearLayout)findViewById(R.id.activitymain);
    TextView textview=(TextView)getLayoutInflater().inflate(R.layout.categorytitle,null);
    textview.setTextColor(Color.CYAN);
    textview.setTextSize(20);
    textview.setText(catTitle);

   HorizontalScrollView horizontalScroll = new HorizontalScrollView (this,null);
    LinearLayout LL = new LinearLayout(this);
    LL.setOrientation(LinearLayout.HORIZONTAL);
    LayoutParams LLParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
    LL.setLayoutParams(LLParams);
    HorizontalGalleryAdapter adapter = new HorizontalGalleryAdapter(this,mVideos);
    for (int i = 0; i < adapter.getCount(); i++) {
          View item = adapter.getView(i, null, null);
          LL.addView(item);
    }



    horizontalScroll.addView(LL);
    int maxScrollX = horizontalScroll.getChildAt(0).getMeasuredWidth()-horizontalScroll.getMeasuredWidth();
    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    alertDialog.setTitle("Reset...");
    String max= String.valueOf(maxScrollX);

2 个答案:

答案 0 :(得分:2)

好的,我看到了问题。您创建一个Horizo​​ntalScrollView,向其添加一个子项,然后立即尝试获取其测量的宽度。

你不能这样做。您必须首先将水平滚动视图添加到活动中现有的已绘制视图中,否则它还没有设置尺寸。

想一想如何知道WRAP_CONTENT在视图布局之前将尺寸设置为多少像素?如果将其添加到活动中现有的已布局视图中,那么WRAP_CONTENT实际上将转换为某个高度。

看起来你有一个循环 - horizo​​ntalScroll的维度取决于它的内容(WRAP_CONTENT),但内容的(LinearLayout)维度取决于horizo​​ntalScroll的维度。这根本不符合逻辑。也许至少尝试MATCH_PARENT的水平滚动视图的宽度尺寸。然后,确保在绘制视图之前不要查看尺寸。

答案 1 :(得分:1)

查看Horizo​​ntalScrollView的典型用法示例:

// read a view's width
private int viewWidth(View view) {
    view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    return view.getMeasuredWidth();
}
....
void getTableRowHeaderCellWidth(){

    int tableAChildCount = ((TableRow)this.tableA.getChildAt(0)).getChildCount();
    int tableBChildCount = ((TableRow)this.tableB.getChildAt(0)).getChildCount();;

    for(int x=0; x<(tableAChildCount+tableBChildCount); x++){

        if(x==0){
            this.headerCellsWidth[x] = this.viewWidth(((TableRow)this.tableA.getChildAt(0)).getChildAt(x));
        }else{
            this.headerCellsWidth[x] = this.viewWidth(((TableRow)this.tableB.getChildAt(0)).getChildAt(x-1));
        }

    }
}

您还可以查看这个精彩教程的完整详细信息:The code of a Ninja