2

我似乎不明白是否可以将一项活动膨胀(包括)到另一项活动中。我知道我可以为布局 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。感谢您的宝贵时间。

4

2 回答 2

10

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

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

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

你知道我做错了什么吗?

是的。绝对地。

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

这不是增加另一个活动的正确方法吗?

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

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

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

了解视图和活动之间的区别很重要。它们之间的过程非常相似,但它们本身有一个相互交织但又相互独立的目的。

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

如需更多信息,请阅读 Android 开发者资源。然而,其中一些东西只能通过实验来学习。

希望这一切都有帮助!

模糊逻辑

于 2012-01-10T18:23:14.963 回答
0

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

您可以从活动 B 分派活动 A,也可以使用 Fragment 的新概念将多个子活动组合成活动。

顺便说一句,您可以定义自定义视图(通过子类化视图类之一)并在您的 XML 布局中使用它,只需将类的完整路径放在布局中而不是 let say 。

于 2012-01-10T17:33:49.693 回答