1

我是 android dev 的新手,在理解每个活动的 xml 配置文件中的事物流时遇到了很多麻烦。我正在尝试在活动中使用片段,但不完全了解它是如何实例化的。android:id=@+id/.... 是否实际实例化了片段?是否相当于在代码中调用 TestFragment fragment = new TestFragment() ?如果有人能澄清这一点或向我指出一个很好的资源来解释这一点,将不胜感激。

提前致谢

PS这就是 +id 通常的作用吗?实例化组件(如 new...)

4

4 回答 4

2

要使用已经在 Android 系统中定义的 Android 资源,您可以使用@android:id/..while 访问它来访问您在项目中定义/创建的资源,您必须使用@id/..

如果我们使用android:id="@id/layout_item_id"它是行不通的。而是@+id/有效,所以这里有什么区别。

好吧,这取决于上下文,当您使用 的 XML 属性时android:id,您将指定一个新的 id,并指示解析器(或称其为构建器)在 中创建一个新条目R.java,因此您必须包括一个+ sign.

而在另一种情况下,例如android:layout_below="@id/myTextView",您指的是已经创建的 id,因此解析器将其链接到已创建的 idR.java

    Is it the equivalent of calling a TestFragment fragment = new TestFragment() in the code? 

ids在 xml 中定义与初始化Fragments.

您可以通过以下两种方式定义/初始化片段:

1)在活动的布局文件中声明片段。 在这种情况下,您可以为片段指定布局属性,就好像它是一个视图一样。例如,这是一个包含两个片段的活动的布局文件:

  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
<fragment android:name="com.example.news.ArticleListFragment"
        android:id="@+id/list"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />
<fragment android:name="com.example.news.ArticleReaderFragment"
        android:id="@+id/viewer"
        android:layout_weight="2"
        android:layout_width="0dp"
        android:layout_height="match_parent" />
  </LinearLayout>

中的android:name属性<fragment>指定要在布局中实例化的 Fragment 类。当系统创建这个活动布局时,它会实例化布局中指定的每个片段,并onCreateView()为每个片段调用方法,以检索每个片段的布局。系统将片段返回的 View 直接插入到元素的位置。

2) 以编程方式将片段添加到现有的 ViewGroup。

在您的活动运行时,您可以随时将片段添加到活动布局中。您只需要指定一个 ViewGroup 来放置片段。要在您的活动中进行片段事务(例如添加、删除或替换片段),您必须使用来自FragmentTransaction. FragmentTransaction您可以像这样从您的 Activity中获取一个实例:

   FragmentManager fragmentManager = getFragmentManager()
   FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

然后,您可以使用该add()方法添加片段,指定要添加的片段和插入片段的视图。例如:

   ExampleFragment fragment = new ExampleFragment();
   fragmentTransaction.add(R.id.fragment_container, fragment);
   fragmentTransaction.commit();

有关更多详细信息,请查看 片段

于 2013-05-15T15:30:21.680 回答
1

您有两种不同的方式来实例化片段:

  1. 放入您的布局片段标签,如

  2. 放入您的布局 FrameLayout

在第一种情况下(1.)您的片段是静态的,这意味着您不能在运行时更改它,而使用 framelayout 您可以使用例如:

Fragment2 f2 = new Fragment2();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fl1, f2);
ft.commit();

在 Android 中,+id 只是意味着您正在添加一个新的 id,仅此而已,它不会实例化任何东西。@+id/... 与 @id/... 不同,这意味着您指的是现有的 id。

于 2013-05-15T15:24:48.783 回答
0

您可以使用 XML 创建片段作为应用程序布局的一部分。这将使您能够更好地模块化代码并更轻松地将用户界面调整为运行它的屏幕。看看这个例子:

<!-- fragment_layout.xml -->
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="match_parent">
    <fragment 
        class="com.example.android.apis.app.FragmentLayout$TitlesFragment"
        android:id="@+id/titles"
        android:layout_width="match_parent" android:layout_height="match_parent" />
</FrameLayout>

我上面的示例属性定义了 Fragment 类,在这种情况下,它是 TitlesFragment 类。

因此,在您的活动中以标准方式安装布局:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_layout);
}

和 TitlesFragment 类:

public static class TitlesFragment extends Fragment {

// Implementation of your fragment class
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
    .
    .
    .
}

有关更多信息,请查看文档http://developer.android.com/reference/android/app/Fragment.html

于 2013-05-15T15:22:55.560 回答
0

基本上,当您在文件中为此创建 aView或 a时,您实际上所做的是为自己节省大量代码行来创建相同的或在代码中。原因是后者将使用. (这将在您将其设置为您的时发生)。LayoutXMLViewLayoutXMLLayoutInflatorViewsetContentView()Activity

您在 XML 布局文件中定义的片段也是如此。

于 2013-05-15T15:23:16.320 回答