2011-02-03 10 views
14

getWidth()/ getHeight()を使用してXMLレイアウトの幅/高さを取得します。 私はメソッドonSizeChanged()でそれをしなければならないと、私は0 (Android: Get the screen resolution/pixels as integer values)を得るでしょう。Android:クラスを拡張するView.getWidth/Height()にonSizeChangedを使用する必要があります。アクティビティ

しかし、すでにActivityを拡張しているクラスでやりたいと思います。 同じクラスをViewにすることはできないと思います。

public class MyClass extends Activity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ViewGroup xml_layout = (ViewGroup) findViewById(R.id.layout_id); 
     TextView tv = new TextView(this); 
     tv = (TextView) findViewById(R.id.text_view); 
     int layout_height = xml_layout.getHeight(); 
     int layout_width = xml_layout.getWidth(); 
    } 

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     //Error, because I need to use extends View for class, but I can't do it because I also need extends Activity to use onCreate 
    } 
} 

私がMyClassアクティビティを使用する場合、私はonCreateを使用できますが、onSizeChangedは使用できません。
私がMyClassを使用してViewを拡張する場合、onCreateではなくonSizeChangedbutを使用できます。

どうすれば問題を解決できますか?

答えて

1

アクティビティでonSizeChangedが発生したときに呼び出すカスタムビューにメソッドを追加するだけです。呼び出されたメソッドのパラメータとして新しい値をビューに渡します。次に、カスタム表示がサイズを変更するときに実行する必要のある操作を実行します。

+0

申し訳ありませんが、実際に何をすべきか分かりません。自分のアクティビティクラスがActivityではなくViewであるため、onSizeChangedがアクティビティで発生したときにカスタムビューを呼び出すことはできません。しかし、私はonSizeChangedメソッドを使用するためにビューを拡張する必要があります。あなたが少しのコード例を与えることができれば素晴らしいだろう。 – KWT

19

私がやりたいことは、独自のカスタムクラスでListViewを拡張することです。 MyListViewなどのクラスを定義し、3つのコンストラクターをすべて定義してください。次に、onSizeChangedメソッドをオーバーライドして、OnClickListenerやOnTouchListenerのように外部から何かを呼び出します。 MyListViewでメソッドを定義して、リスナーを受け入れ、アクティビティでリスナーをインスタンス化し、次にonSizeChangedが呼び出されたときにリスナーに渡すことができます。これは英語で説明するのが本当に難しいです。ここではいくつかのサンプルコードは次のとおりです。

カスタムリストビュー:

public class MyListView extends ListView 
{ 
    public MyListView(Context context) 
    { 
     super(context); 
    } 
    public MyListView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 
    public MyListView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    public void SetOnResizeListener(MyOnResizeListener orlExt) 
    { 
     orl = orlExt; 
    } 

    @Override 
    protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) 
    { 
     super.onSizeChanged(xNew, yNew, xOld, yOld); 

     if(orl != null) 
     { 
      orl.OnResize(this.getId(), xNew, yNew, xOld, yOld); 
     } 
    } 

    MyOnResizeListener orl = null; 
} 

カスタムリスナー:

public class MyOnResizeListener 
{ 
    public MyOnResizeListener(){} 

    public void OnResize(int id, int xNew, int yNew, int xOld, int yOld){} 
} 

あなたが好きなリスナーをインスタンス化:

Class MyActivity extends Activity 
{ 
     /***Stuff***/ 

    MyOnResizeListener orlResized = new MyOnResizeListener() 
    { 
      @Override 
      public void OnResize(int id, int xNew, int yNew, int xOld, int yOld) 
      { 
      /***Handle resize event****/ 
      } 
    }; 
} 

そして合格することを忘れないでくださいリスナをカスタム表示に変更します。

/***Probably in your activity's onCreate***/ 
((MyListView)findViewById(R.id.MyList)).SetOnResizeListener(orlResized); 

最後に、あなたは次のような何かを行うことによって、XMLレイアウトにカスタムリストを追加することができます。

<com.myapplication.whatever.MyListView> 
     <!-- Attributes --> 
<com.myapplication.whatever.MyListView/> 
+0

ありがとうございました!しかし、フラグメントでこれを使用すると、欠陥に気付きました。フラグメントビューはonCreateのActivityによって処理されなかったので、onStart()メソッドでリスナーを渡さなければなりませんでした(したがって、onCreateViewは何のためですか)。 –

0

私はあなたが知りたい知っていると思う........... I今すぐそのブログ記事を投稿しました... AndroidでcustomView(extends View)の幅と高さの寸法を取得する方法http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html

+0

URL短縮語は使用しないでください。 http://meta.stackexchange.com/questions/99136/let-me-flag-that-for-you-url-shortener-cleanup –

34

customViewを作成する必要はありませんその高さと幅を取得します。あなたは、幅/高さがしたいビューにOnLayoutChangedListener(description here)を追加し、基本的にそう

View myView = findViewById(R.id.my_view); 
myView.addOnLayoutChangeListener(new OnLayoutChangeListener() { 

     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, 
       int oldBottom) { 
      // its possible that the layout is not complete in which case 
      // we will get all zero values for the positions, so ignore the event 
      if (left == 0 && top == 0 && right == 0 && bottom == 0) { 
       return; 
      } 

      // Do what you need to do with the height/width since they are now set 
     } 
    }); 

ビューは後にのみ描かれているので、この理由があるように、onLayoutChanged方法で値を取得することができますレイアウトは完了です。次に、ビュー階層ツリーを歩き、描画する前に各ビューの幅/高さを測定します。

+7

OnLayoutChangeListenerはターゲットがAPI 11+と仮定します。 –

+3

これを指摘してくれてありがとう、@ CarlWhalley!私はAPI 10でそれを使用しようとしたときに気付いた。私はあなたのレイアウトの高さ/幅が他のレイアウト(相対レイアウトやレイアウトウェイトを使用している)によって決定されることに依存しない場合、Viewを次のように測定することも強制できます:view.measure MeasureSpec.UNSPECIFIED、MeasureSpec.UNSPECIFIED)、getMeasuredHeight/Widthを使用して値を取得します。 – kajham

+0

@kajhamそれはonCreateで動作しますか?私は活動が始まるときに次元を取得しようとしていた、私は考えていた.measureは、画面の高さ/幅の測定では、ナビゲーションバーをカウントすると思った... – Fallenreaper

4

私にも同様の問題がありました。図面が完成した後にActivityViewのサイズを計算する)。

私はActivityメソッドをオーバーライドしました:public void onWindowFocusChanged(boolean hasFocus) これは問題なく動作しました。

+0

それはうまく動作し、アンドロイド11を必要としません...ありがとう! – speedplane

+0

'onWindowFocusChanged'はうまく動作していないようです。私は 'ExpandableListActivity'を拡張する' Activity'を持っています。 'onWindowFocusChanged'メソッドをオーバーライドして、' ExpandableListView:mListView.setIndicatorBounds'を呼び出して、グループインジケータを左ではなくビューの右側に揃えるようにしました。私が見ていることは、グループのインジケーターが左に揃えられた状態ですべての子が作成され、右のグループインジケーターで別の再描画が行われることです。この再配置が起こっていることがわかります。これは、これがビューのレイアウトを行うのに最適な場所ではない可能性があることを示しています。 –

関連する問題