Android:需要在类扩展活动中使用onSizeChanged for View.getWidth/Height()
我想使用getWidth()/getHeight()获取XML布局的宽度/高度。 我读到我必须在onSizeChanged()方法中执行此操作,否则我将得到0 () 但我想在一个已经在扩展活动的类中这样做。 所以我认为不可能让同一个类扩展视图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
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的用途)。