我想使用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。
我该如何解决这个问题?
答案 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(扩展视图)的宽度和高度尺寸