请教View的inflate方法

laonawuli 2010-12-29 12:48:28
大家好!
我看了某段源码,如下:
public class MainMenuView extends Activity
{

private View myView;
private Botton myButton;
private void getMyView()
{
myView= View.inflate(this, R.layout.main, null);
myButton =(Button)myView.findViewById(R.id.button);
}
......
}

上一段代码通过 View.inflate方法对myView进行了填充,于是myButton就可以通过myView.findViewById(R.id.button)获得;

我仿照上面的代码,写了一个继承自View的类,如下:

public class MyView extends View
{
private Botton myButton;
private void InitMyView()
{
View.inflate(this, R.layout.main, null);
myButton=(Button)findViewById(R.id.button);
}
....
}
我这个View类想达到的目的就是,这个类自己将一个布局文件填充给自己,然后从该布局文件中获得其他控件。
可是,当 InitMyView() 这个方法执行到myButton=(Button)findViewById(R.id.button);之后,myButton是空的。请问,我该如何解决这个问题?

感激不尽!
...全文
5310 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
laonawuli 2010-12-30
  • 打赏
  • 举报
回复
多谢freshui与pang3510726681的解答,受益匪浅!
pang3510726681 2010-12-29
  • 打赏
  • 举报
回复
搂住想自己封装一个view,你这样改,问题改了,但封装view的问题没解决。
甜tianquan 2010-12-29
  • 打赏
  • 举报
回复
改进方法,很简单:

public class MyView extends View

换成
public class MyView extends Activity
[/Quote]
pang3510726681 2010-12-29
  • 打赏
  • 举报
回复
View.inflate(this, R.layout.main, null);
已经给你返回一个view了,为什么还要把他再封装在一个View里呢?有些多此一举。布局文件只是View的另一种表现形式。
View本身他没有填充布局文件的接口(因为布局文件是View的另外一种表现形式,不需要再来填充).对于你这个有多个组件的,你可以用Layout类去封装,例如:

public class RecentApplicationsBackground extends LinearLayout {
在xml文件中的使用:
<com.android.internal.policy.impl.RecentApplicationsBackground
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/recent_dialog_background"
或者用Code的直接使用。
freshui 2010-12-29
  • 打赏
  • 举报
回复
改进方法,很简单:

public class MyView extends View

换成
public class MyView extends Activity
freshui 2010-12-29
  • 打赏
  • 举报
回复
OK,我看到问题了。

这是定义:
public static View inflate(Context context, int resource, ViewGroup root) {
LayoutInflater factory = LayoutInflater.from(context);
return factory.inflate(resource, root);
}

第一个参数是context, Activity是context, view不是, 因此第二种调用方法就不对。
inflate要使用activity中实现的 LayoutInflater.Factory
view中没有context,更没有 LayoutInflater.Factory。

第一个调用中的this,通过继承关系,是一个MainMenuView->Activity->ContextThemeWrapper->ContextWrapper->Context

你自己写的:MyView->View

可能人家的命名方式误导你了, 如果人家将MainMenuView命名为MainMenuActivity,就不会有任何疑问了。

youngwolf 2010-12-29
  • 打赏
  • 举报
回复
inflate是静态的,你
View.inflate(this, R.layout.main, null);
其实是返回一个View(返回值你没使用,直接扔掉了),并不是inflat到你的MyView!
freshui 2010-12-29
  • 打赏
  • 举报
回复
问题应该就在人家 MainMenuView 是 extends Activity

Activity会做很多东西, 首先所有view要依附的Window和Surface都会在这里创建,这样你的view就会有实际的落脚点了(view只是个逻辑的东西,其要render到surface上的)。否则只是虚拟的东西(因为没有落脚点,就无法实例出一个真正的东西——画不出来).
Activity等源代码还没看过,不过其定义:
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks {
}

我猜应该和这个 implements LayoutInflater.Factory 有极大关系。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧