2016-01-07 3 views
0

Я создал DashbordLayout, чтобы просмотреть список кнопок. Мне нужно установить средство просмотра прокрутки в моем макете. Мой макет показан здесь:Как установить вид прокрутки в моем макете

<com.psybo.shahi.localareaportal.DashboardLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_weight="1" 
android:background="#f8f9fe"> 
<Button 
    android:id="@+id/btn_news_feed" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/place" 
    android:text="@string/my_place" /> 

<Button 
    android:id="@+id/btn_friends" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/education" 
    android:text="@string/education" /> 

<!-- Messages Button --> 
<Button 
    android:id="@+id/btn_messages" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/bus" 
    android:text="@string/bus_time" /> 

<Button 
    android:id="@+id/btn_places" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/train" 
    android:text="@string/train_time" /> 

<Button 
    android:id="@+id/btn_events" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/auto" 
    android:text="@string/auto" /> 

<Button 
    android:id="@+id/btn_photos" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/taxi" 
    android:text="@string/taxi" /> 

<Button 
    android:id="@+id/btn_goods" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/goods" 
    android:text="@string/goods" /> 

<Button 
    android:id="@+id/btn_business" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/business" 
    android:text="@string/business" /> 

<Button 
    android:id="@+id/btn_hospital" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/hospital" 
    android:text="@string/hospital" /> 
<Button 
    android:id="@+id/btn_bleed" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/blood" 
    android:text="@string/bleed_bank" /> 
<Button 
    android:id="@+id/btn_pani" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/pani" 
    android:text="@string/pani" /> 
<Button 
    android:id="@+id/btn_emergency" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/emergency" 
    android:text="@string/emergency" /> 
<Button 
    android:id="@+id/btn_feedback" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/feedback" 
    android:text="@string/feedback" /> 
<Button 
    android:id="@+id/btn_we" 
    style="@style/DashboardButton" 
    android:drawableTop="@drawable/we" 
    android:text="@string/we" /> 

enter image description here

Этот макет создается со следующим классом дается сильфона.

package com.psybo.shahi.localareaportal; 


import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 


public class DashboardLayout extends ViewGroup { 

private static final int UNEVEN_GRID_PENALTY_MULTIPLIER = 10; 

private int mMaxChildWidth = 0; 
private int mMaxChildHeight = 0; 

public DashboardLayout(Context context) { 
    super(context, null); 
} 

public DashboardLayout(Context context, AttributeSet attrs) { 
    super(context, attrs, 0); 
} 

public DashboardLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    mMaxChildWidth = 0; 
    mMaxChildHeight = 0; 

    // Measure once to find the maximum child size. 

    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST); 
    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST); 

    final int count = getChildCount(); 
    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 

     child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 

     mMaxChildWidth = Math.max(mMaxChildWidth, child.getMeasuredWidth()); 
     mMaxChildHeight = Math.max(mMaxChildHeight, child.getMeasuredHeight()); 
    } 



    childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
      mMaxChildWidth, MeasureSpec.EXACTLY); 
    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
      mMaxChildHeight, MeasureSpec.EXACTLY); 

    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 

     child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
    } 

    setMeasuredDimension(
      resolveSize(mMaxChildWidth, widthMeasureSpec), 
      resolveSize(mMaxChildHeight, heightMeasureSpec)); 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    int width = r - l; 
    int height = b - t; 

    final int count = getChildCount(); 

    // Calculate the number of visible children. 
    int visibleCount = 0; 
    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 
     ++visibleCount; 
    } 

    if (visibleCount == 0) { 
     return; 
    } 


    int bestSpaceDifference = Integer.MAX_VALUE; 
    int spaceDifference; 

    // Horizontal and vertical space between items 
    int hSpace = 0; 
    int vSpace = 0; 

    int cols = 1; 
    int rows; 

    while (true) { 
     rows = (visibleCount - 1)/cols + 1; 

     hSpace = ((width - mMaxChildWidth * cols)/(cols + 1)); 
     vSpace = ((height - mMaxChildHeight * rows)/(rows + 1)); 

     spaceDifference = Math.abs(vSpace - hSpace); 
     if (rows * cols != visibleCount) { 
      spaceDifference *= UNEVEN_GRID_PENALTY_MULTIPLIER; 
     } 

     if (spaceDifference < bestSpaceDifference) { 
      // Found a better whitespace squareness/ratio 
      bestSpaceDifference = spaceDifference; 


      if (rows == 1) { 
       break; 
      } 
     } else { 
      // This is a worse whitespace ratio, use the previous value of cols and exit. 
      --cols; 
      rows = (visibleCount - 1)/cols + 1; 
      hSpace = ((width - mMaxChildWidth * cols)/(cols + 1)); 
      vSpace = ((height - mMaxChildHeight * rows)/(rows + 1)); 
      break; 
     } 

     ++cols; 
    } 


    hSpace = Math.max(0, hSpace); 
    vSpace = Math.max(0, vSpace); 

    // Re-use width/height variables to be child width/height. 
    width = (width - hSpace * (cols + 1))/cols; 
    height = (height - vSpace * (rows + 1))/rows; 

    int left, top; 
    int col, row; 
    int visibleIndex = 0; 
    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 

     row = visibleIndex/cols; 
     col = visibleIndex % cols; 

     left = hSpace * (col + 1) + width * col; 
     top = vSpace * (row + 1) + height * row; 

     child.layout(left, top, 
       (hSpace == 0 && col == cols - 1) ? r : (left + width), 
       (vSpace == 0 && row == rows - 1) ? b : (top + height)); 
     ++visibleIndex; 
    } 
    } 
    } 

Я дает ScrollViewer в начало layout.But изменения выравнивания макета, как показано ниже изображения

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/ScrollView01" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
      ------- here DashbordLayout ------ 
</ScrollView> 

enter image description here

мне нужно знать, как набор просмотра прокрутки в моем выравнивании.

+0

Try удаления андроида: layout_weight = "1" из com.psybo.shahi.localareaportal.DashboardLayout – ajantha

ответ

1

Вы должны установить android:fillViewport="true" в вашем ScrollView

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ScrollView01" 
    android:fillViewport="true" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
Смежные вопросы