1

似たような質問がたくさんありますが、ほとんどが不明瞭な英語で書かれているか、解決策が不完全です。

ユーザーには GridView が表示されます。GridView 内の項目が十分に大きいため、ユーザーがスクロールしてより多くのグリッドビューを表示する必要がある場合、ユーザーには最初はボタンが表示されません。ユーザーがスクロールしてグリッドビューの下部に到達すると、クリックできるボタンが表示されます。

これを XML で取得するにはどうすればよいですか? これまでに試した解決策は、次のいずれかになります。

1) ビューポートの下部にあるグリッドビューの上にボタンを重ねます。ボタンは常に表示されます。

2) ボタンが表示される「フッター バー」を作成します。ボタンは常に表示されます。

ユーザーがグリッドビューの一番下までスクロールするまでボタンが表示されないため、これらはどちらも私が望むものではありません。

(グリッドビューの下部にボタンが存在する余分な行があると考えることができます)

7/23 更新:

これが現在の繰り返しです。mButton.getMeasuredHeight() は、onMeasure で呼び出されると 0 になります。init() で setWidth() / setHeight() を使用して幅または高さを設定しようとしても、これは変わりません。ボタンの幅/高さはどこで設定する必要がありますか?

また、グリッドがロードされた直後にアプリがクラッシュすることにも注意してください。理由がわからない。

public class MyGridView extends GridView {

  private Button mButton;

  public MyGridView(Context context) {
    super(context);
    init(context);
  }

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

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

  private void init(Context context) {
    mButton = new Button(context);
    mButton.setText("test test test");
  }

  @Override
  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);

    int buttonLeft = left;
    int buttonTop = top + this.getMeasuredHeight();
    int buttonRight = left + mButton.getMeasuredWidth();
    int buttonBottom = bottom + getMeasuredHeight() + mButton.getMeasuredHeight();

    mButton.layout(buttonLeft, buttonTop, buttonRight, buttonBottom);
  }


  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(parentWidth, parentHeight + mButton.getMeasuredHeight());
  }
}
4

1 に答える 1

0

1 つの解決策は、 を拡張し、 メソッドとメソッドGridViewをオーバーライドすることです。layoutmeasure

void layout(int l, int t, int r, int b) {
  super.layout(...);
  /* layout your button here.. */
}

これが機能する場合は、onMeasureメソッドをオーバーライドする必要はありません。そうでない場合は、ボタンの高さをheightMeasureSpecinに追加する必要がありますonMeasure

アップデート:

最初にsuper.onMeasureを呼び出してから、測定された寸法を設定します..これはうまくいくはずです..

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     int parentWidth = MeasureSpec.getSize(widthMeasureSpec) ; 
     int parentHeight = MeasureSpec.getSize(heightMeasureSpec ); 
     this.setMeasuredDimension(parentWidth , 
                               parentHeight + mbutton.getmeasuredheight());

 }

更新 2:

init に変更を加えます。

  private void init(Context context) {
    mButton = new Button(context);
    mButton.setLayoutParams(
                  new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, 50));
    mButton.setText("test test test");
  }

int buttonBottom = bottom  + mButton.getMeasuredHeight();

次のメソッドを Gridview クラスに追加します。

public void addButton() {
    addView(mButton);
}

addButtonアダプターをグリッド ビューに設定した直後に呼び出します。

于 2012-07-21T17:32:48.787 に答える