2

私はカスタムビューに取り組んでいます。水平スクロール ビュー内にカスタム ビューを配置すると、水平スクロールが機能しません。MeasureSpec の記述を間違えたと思いますがカスタム ビューの MeasureSpec の記述 方法がわかりません。

このような私のビュークラスコード

public class Makecell extends ViewGroup{
    private int line_height;  
    private int line_width;
    Context mContext;
    subview sub;
    int left,right,top,bottom;
    MainActivity main;
    public Makecell(Context context) {
        super(context);
        mContext=context;
        // TODO Auto-generated constructor stub
    }

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

         final int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
            int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();

            final int count = getChildCount();
            int line_height = 0;
            int line_width=0;

            int xpos = getPaddingLeft();  
            int ypos = getPaddingTop();
            for (int i = 0; i < count; i++) {
                 final View child = getChildAt(i);
                 if (child.getVisibility() != GONE) {

                     child.measure(
                             MeasureSpec.makeMeasureSpec(width, MeasureSpec.UNSPECIFIED),
                             MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));

                     final int childw = child.getMeasuredWidth();
                     final int childh = child.getMeasuredHeight();
                     line_height = Math.max(line_height, child.getMeasuredHeight());
                     line_width=Math.max(line_width, child.getMeasuredWidth());
                     if (xpos + childh > height) {
                         xpos = getPaddingLeft();
                         ypos += line_width; 
                     }
                     xpos += childw;
                 }
            }

            this.line_width=line_width;


    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub

          final int count = getChildCount();
          final int width = r - l;
          final int hight = b - t;  
          int xpos = 0;
          int ypos = 0;

          for (int i = 0; i < count; i++) {
              final View child = getChildAt(i);
              if (child.getVisibility() != GONE) {
                  final int childw = child.getMeasuredWidth();
                  final int childh = child.getMeasuredHeight();
//                
                  if (xpos + childh > hight) {
                      xpos = getPaddingLeft();
                      ypos += line_width;


                  }
                child.layout(ypos, xpos,ypos + childw, xpos + childw );
                xpos += childh;

              }
          }
    }
}

およびxmlは次のようになります

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
   <HorizontalScrollView 
       android:layout_height="match_parent"
       android:layout_width="match_parent"
       android:fillViewport="true"
       android:id="@+id/rootlin"
       > 
   </HorizontalScrollView>
</RelativeLayout>

コードにビューを追加するのは次のようになります

cell=new Makecell(getApplicationContext());
        mainlin=(HorizontalScrollView)findViewById(R.id.rootlin);
        LinearLayout lin=new LinearLayout(this);
        lin.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT));
        lin.setOrientation(LinearLayout.HORIZONTAL);
        for(int i=0;i<100;i++)
        {
            text=new TextView(this);
            text.setText("Text "+i);
            text.setTextSize(15);
            text.setBackgroundColor(Color.CYAN);
            text.setWidth(screenwidth/2);
            cell.addView(text);
        }
        lin.addView(cell);
        mainlin.addView(lin);

私が間違いを犯した場所を見つけるのを手伝ってくれる人はいますか

前もって感謝します..

4

1 に答える 1

-1

それらの両方が機能しています:

Javaで:

    LinearLayout lin=new LinearLayout(this);
    lin.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT));
    lin.setOrientation(LinearLayout.HORIZONTAL);
    lin.setHorizontalScrollBarEnabled(true);

そしてxmlファイルで:

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:scrollbars="horizontal"
      android:orientation="horizontal"
      tools:context=".MainActivity" >
   </LinearLayout>
于 2013-03-13T06:41:26.920 に答える