在Android中膨胀活动和膨胀视图有什么区别?

use*_*656 2 android android-inflate

我似乎不明白是否可以将一项活动(包括)扩展到另一项活动中.我知道我可以膨胀布局xml,这可行,但我想知道我是否可以膨胀一项活动.例如,我有一个扩展Activity的类A和一个扩展ListActivity的另一个类B. 我可以在A级,我的B级包括和使用吗?这是我试过的:

A类:

LayoutInflater inflater = (LayoutInflater) MyActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // inflate list
    BActivity list = new BActivity();
Run Code Online (Sandbox Code Playgroud)

B级:

public class BActivity extends ListActivity {
  public void onCreate(Bundle bundle) {
    super.onCreate(bundle);

    List<Model> models= new ArrayList<Model>();
    models.add(new Model("John"));
    models.add(new Model("Cage"));

    setListAdapter(new MyAdapter(this, models));
    ListView list = getListView();
  }
}
Run Code Online (Sandbox Code Playgroud)

并在xml(类A xml)中:(我希望在哪里看到列表)

 <view class="com.test.BActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >  </view>
Run Code Online (Sandbox Code Playgroud)

所有这些都会引发错误:

膨胀类BActivity时出错

活动在清单中声明.

你知道我做错了什么吗?这不是扩充另一项活动的正确方法吗?我使用的是Android 2.2 api 8.谢谢你的时间.

Fuz*_*gic 10

你的问题标题和你的问题实际上并不是一回事.为了完整起见,我将回答这两个问题.

在Android中膨胀活动和膨胀视图有什么区别?

答案是没有区别.最终,它们在过程和逻辑上是相同的.但是,活动可能有许多不同的视图,您可能会setContentView()根据需要多次使用几种不同的布局或视图.活动需要布局资源,而视图可能是也可能不是布局.

你知道我做错了什么吗?

是.绝对.

  1. 您的代码:BActivity list = new BActivity();实际上并没有使活动膨胀.您正在构建活动,但没有启动它.
  2. 您的XML定义BActivityView,但您的代码将其定义为ListActivity.这完全是两件不同的事情.甲ListActivity 已经一个ListView(扩展或以其他方式); 一个ListActivity 是不是一个ListView.
  3. Activity它的子类Contexts具有由OS管理的生命周期.它们包含并说明Views所有类型,但它们本身并不是视图.

这不是扩充另一项活动的正确方法吗?

不,先生,但不要害怕!答案并不太遥远.

  1. 假的答案(为了完整性) - 首先,要启动另一个活动以使其膨胀,您必须startActivity()从a 调用Context.A Context可以是应用程序,活动,广播接收器或任何其他应用程序组件(组件= Android项目清单中声明的​​对象).所以,如果你真的想开始一个新的Activity,你会BActivity list = new BActivity();改为:

    Intent _listActivity = new Intent();
    _listActivity.setClass(BActivity.class);
    startActivity(_listActivity);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 真实答案 - 但是,由于您希望在A类中看到您的列表,因此BActivity不是一个活动,它是一个视图.这意味着你真正想要的是让它识别你的View,这是一个不同的解决方案.更改public class BActivity extends ListActivitypublic class BActivity extends ListView现在突然你有一个自定义视图!现在我们所要做的就是让List工作.

  3. 构建视图 - 视图与活动不同,因为它们没有public void onCreate(Bundle bundle).你所有的东西BActivity.onCreate()都将被放置在构造函数中.但是,你没有一个合适的构造函数......嗯.好吧,有三个构造函数可供选择 - 添加以下一个或全部(您可能首先需要选项1或2.但是您不会同时使用两个提示提示,请阅读注释:

    //This constructor is used when the View is created from code (not XML!!)
    public BActivity(Context context)
    {
    }
    
    //This constructor is used when the View is created from XML (not code!!)
    public BActivity(Context context, AttributeSet attr)
    {
    }
    
    //This constructor is used when the View is created from XML with a Style defined in separate XML.
    public BActivity(Context context, AttributeSet attr, int defStyle)
    {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 膨胀活动=膨胀视图 您可以在这里选择,您可以添加视图,也可以膨胀视图.两者都有很多选择.根据你的问题,我假设你想要膨胀视图.只需BActivity list = new BActivity();改为setContentView(R.id.MyXML).当然,MyXML将是XML布局文件的名称.然后,SetContentView将使用上面列表中的第二个构造函数为您打开相应的视图(BActivity).

了解视图和活动之间的区别非常重要.它们之间的过程非常相似,但它们本身具有相互交织但分开的目的.

  • 活动必须有一个视图.
  • 视图必须在上下文中.
  • Activity是一个Context,但Context也可能是其他几个可能的类之一.
  • 两者都可以用a来膨胀 LayoutInflater
  • 一个Activity都有一个称为方便的方法setContentView,其可以膨胀整个XML文件.
  • 视图必须使用手动为每个视图充气LayoutInflater object.inflate().
  • 活动具有生命周期.视图具有绘制周期.

有关更多信息,请务必阅读有关Android开发人员资源的更多信息.然而,其中一些事情只能通过实验来学习.

希望这一切都有帮助!

FuzzicalLogic