Android:需要在扩展Activity的类中使用onSizeChanged for View.getWidth / Height()

时间:2011-02-03 16:15:31

标签: android

我想使用getWidth()/ getHeight()来获取XML-Layout的宽度/高度。 我读过我必须在方法onSizeChanged()中这样做,否则我会得到0 (Android: Get the screen resolution / pixels as integer values)。

但是我想在已经扩展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 extends Activity,我可以使用onCreate但不能使用onSizeChanged 如果我使用MyClass extends View我可以使用onSizeChangedbut而不是onCreate。

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:36)

您无需创建customView来获取其高度和宽度。您可以将OnLayoutChangedListener(description here)添加到您想要的宽度/高度的视图中,然后基本上获取onLayoutChanged方法中的值,如下所示

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
        }
    });

原因是因为视图仅在布局完成后绘制。然后系统沿着视图层次树走下去,在绘制之前测量每个视图的宽度/高度。

答案 1 :(得分:20)

我建议您在自己的自定义类中扩展ListView。定义一个名为MyListView的类或类似的类,并确保定义所有三个构造函数。然后,重写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/>

答案 2 :(得分:4)

我遇到了类似的问题(即在完成绘图后计算View中的Activity尺寸。)

我覆盖了Activity方法:public void onWindowFocusChanged(boolean hasFocus) 它运作良好。

答案 3 :(得分:1)

只需在自定义视图中添加一个方法,即在活动中发生onSizeChanged时调用该方法。将新值作为被调用方法的参数传递给视图。然后执行自定义视图更改大小时需要执行的任何操作。

答案 4 :(得分:0)

我想我知道你想知道什么...........我刚刚写了一篇新的博客文章........... 如何在Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html

中获取customView(扩展视图)的宽度和高度尺寸