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

时间:2012-01-10 17:24:29

标签: 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();

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();
  }
}

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

 <view class="com.test.BActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >  </view>

所有这些都会引发错误:

  

错误提升课程BActivity

活动在清单中声明。

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

2 个答案:

答案 0 :(得分:10)

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

  

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

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

  

你知道我做错了吗?

是。绝对。

  1. 您的代码:BActivity list = new BActivity();实际上并没有给某个活动充气。您构建活动,但没有启动它。
  2. 您的XML将BActivity定义为View,但您的代码将其定义为ListActivity。这完全是两件不同的事情。 ListActivity 一个ListView(扩展或其他); ListActivity 不是一个ListView
  3. Activity及其子类为Contexts,其生命周期由操作系统管理。它们包含所有类型的Views并与之交谈,但它们本身并不是视图。
  4.   

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

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

    1. FAKE ANSWER(完整性) - 首先,要启动另一个活动以使其膨胀,您必须从startActivity()拨打ContextContext可以是应用程序,活动,广播接收器或任何其他应用程序组件(Component =在Android项目清单中声明的​​对象)。因此,如果您真的想要开始新的活动,则可以将BActivity list = new BActivity();更改为:

      Intent _listActivity = new Intent();
      _listActivity.setClass(BActivity.class);
      startActivity(_listActivity);
      
    2. REAL ANSWER - 但是,由于您希望在A类中查看您的列表,因此BActivity不是一个活动,而是一个视图。这意味着你真正想要的是让它识别你的View,这是一个不同的解决方案。将public class BActivity extends ListActivity更改为public 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)
      {
      }
      
    4. 充气活动=充气视图 您可以在此处选择,您可以添加视图,也可以充气视图。两者都有很多选择。根据你的问题,我假设你想要膨胀视图。只需将BActivity list = new BActivity();更改为setContentView(R.id.MyXML)即可。当然,MyXML将是XML布局文件的名称。然后,SetContentView将使用上面列表中的第二个构造函数为您打开相应的视图(BActivity)。

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

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

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

      希望这一切都有所帮助!

      FuzzicalLogic

答案 1 :(得分:0)

膨胀意味着解析对象的XML描述并使用所描述的属性构建Java对象。活动没有XML中的详细描述,因此无需夸大它们。

您可以从活动B派遣活动A,或者您可以使用Fragment的新概念将多个子活动合并到活动中。

顺便说一下,您可以定义自定义视图(通过子类化其中一个视图类)并在XML布局中使用它,只需将类填充为完整路径,例如:在布局中而不是说。

相关问题