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

Android:需要在类扩展活动中使用onSizeChanged for View.getWidth/Height(),android,Android,我想使用getWidth()/getHeight()获取XML布局的宽度/高度。 我读到我必须在onSizeChanged()方法中执行此操作,否则我将得到0 () 但我想在一个已经在扩展活动的类中这样做。 所以我认为不可能让同一个类扩展视图 public class MyClass extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedIns

我想使用getWidth()/getHeight()获取XML布局的宽度/高度。 我读到我必须在onSizeChanged()方法中执行此操作,否则我将得到0 ()

但我想在一个已经在扩展活动的类中这样做。 所以我认为不可能让同一个类扩展视图

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活动,我可以使用onCreate,但不能使用onSizeChanged。
如果我使用MyClass extends视图,我可以使用onSizeChangedbut而不是onCreate


如何解决此问题?

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

我建议您在自己的自定义类中扩展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/>

我想我知道你想知道什么。。。。。。。。。。。我刚刚写了一篇关于这个的新博客。。。。。。。。。。。
如何在Android中获取customView(扩展视图)的宽度和高度维度你不必创建一个
customView来获取其高度和宽度。您可以将OnLayoutChangedListener()添加到所需宽度/高度的视图中,然后在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
        }
    });
这是因为视图仅在布局完成后绘制。然后,系统沿着视图继承人树向下走,在绘制每个视图之前测量每个视图的宽度/高度。

我有一个类似的问题(即在完成绘制后计算
活动中的
视图的大小)

我重写了
活动
方法:
在WindowFocusChanged(布尔hasFocus)上的public void

而且效果很好。

对不起,我真的不知道该怎么办。在活动中发生onSizeChanged时,我无法调用自定义视图,因为我的活动类扩展了活动而不是视图。但我必须扩展视图以使用onSizeChanged方法。如果您能给出一个小的代码示例,那就太好了。OnLayoutChangeListener假设您的目标是API 11+谢谢您指出这一点,@CarlWhalley!当我尝试在API 10中使用它时,我意识到了这一点:)。事实上,我发现如果布局的高度/宽度不依赖于任何其他布局(用于相对布局或使用布局权重),那么甚至可以强制按如下方式测量视图:View.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED)然后使用getMeasuredHeight/Width获得values@kajham那对你有用吗?当活动开始时,我试图获取尺寸,我想。测量会计算屏幕高度/宽度测量中的导航条……请不要使用URL缩写
onWindowFocusChanged
似乎工作不太好。我有一个扩展
ExpandableListActivity
活动。我重写了windowfocuschanged的
oncode
方法来调用
ExpandableListView:mListView.setIndicatorBounds
,以便将组指示器与视图的右侧对齐,而不是与左侧对齐。我看到的情况是,所有的子项都是使用左侧对齐的组指示符创建的,然后使用右侧的组指示符重新绘制。我可以看到这种重新排列的发生,这表明这可能不是进行视图布局的最佳位置。谢谢!然而,我注意到一个缺陷,当使用这个片段。我必须在onStart()方法中传递侦听器,因为片段视图不是由onCreate中的活动处理的(因此onCreateView的用途)。