我想使用getWidth()/ getHeight()来获取我的XML-Layout的宽度/高度。 我读了我必须在onSizeChanged()的方法做,否则我会得到0( 安卓:获取屏幕分辨率/像素为整数值 )。

但是我想在一个已经扩展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扩展视图,我可以使用onSizeChanged而不是onCreate。

我该如何解决这个问题?

您不必创buildcustomView来获取其高度和宽度。 你可以添加一个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 } });

原因是因为只有在布局完成后才能绘制视图。 系统然后沿着视图分叉树走下来,在绘制每个视图之前测量每个视图的宽度/高度。

我build议做的是扩展ListView在你自己的自定义类。 定义一个名为MyListView的类,或类似的东西,并确保你定义了所有三个构造函数。 然后,重写onSizeChanged方法来调用外部的东西 – 就像一个OnClickListener或OnTouchListener。 你可以在MyListView中定义一个方法来接受一个监听器,在你的活动中实例化一个监听器,然后当onSizeChanged被调用时,将它传递给监听器。 这很难用英文来解释。 这是一些示例代码:

自定义ListView:

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布局中:

我有一个类似的问题(即在完成绘图后,计算Activity View大小)。

我public void onWindowFocusChanged(boolean hasFocus)了Activity方法: public void onWindowFocusChanged(boolean hasFocus) ,它工作正常。

只需将一个方法添加到在Activity中发生onSizeChanged时调用的自定义视图。 将新值作为被调用方法的parameter passing给视图。 然后执行自定义视图更改大小时需要执行的任何操作。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐