【问题标题】:Creating a fragment without instantiating it from java code创建片段而不从 java 代码实例化它
【发布时间】:2016-06-26 01:22:39
【问题描述】:

我有一个由另一个人开发的项目。那里有一个片段,但我找不到是谁在实例化它。主要活动是否可以通过布局xml创建片段?也就是说,如果不使用“new Fragment”在Java代码中实例化它,是否可以通过一些xml或其他东西来实例化它?因为我检查了 Fragment 构造函数的用法,它也没有显示任何其他调用它的类。但是当我调试代码时,片段确实被调用了。如果可能的话,我怎样才能将活动中的参数传递给这个片段?因为如果它使用“Fragment f = new Fragment”创建,我可以使用 setArguments 方法,甚至可以通过构造函数传递它。但是在这样的情况下,我如何将值从活动传递到这个片段?请指教。

【问题讨论】:

  • 是的。布局 是可能的。你会发现这个link很有用。
  • 是的,它可能在 xml 中。如果它是,这就是你如何获得片段。 stackoverflow.com/questions/8532462/…
  • 其实我不需要获取fragment实例。我对它的加载方式很好。但是,如果它是按照它看起来的方式创建的,我怎么能将参数传递给这个片段呢?为了启动这个片段,我调用了 MainActivity 类,这个片段最终加载。有没有办法通过我对 MainActivity 的调用将参数传递给这个片段?

标签: android android-fragments android-activity layout android-fragmentactivity


【解决方案1】:

是的,有可能,请参阅docs。例如,从该页面:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<fragment android:name="com.example.android.fragments.HeadlinesFragment"
          android:id="@+id/headlines_fragment"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="match_parent" />

<fragment android:name="com.example.android.fragments.ArticleFragment"
          android:id="@+id/article_fragment"
          android:layout_weight="2"
          android:layout_width="0dp"
          android:layout_height="match_parent" />

</LinearLayout>

【讨论】:

  • 在这种情况下如何将参数传递给这个片段?
  • 不能在实例化时,但可以在实例化后添加API来自定义片段。或者,将其从布局中移除并在 Activity 中的代码中创建它,以便您可以自定义片段的构造方式。
  • 我需要加载这个片段 1 次。一方面,用户界面应该看起来不同,另一方面,它应该以另一种方式看起来。所以我必须根据传递给它的参数来做这件事。如何将参数传递给该片段? :(
  • 为您的片段创建一个工厂方法并传递一个参数,您可以使用该参数来确定片段的行为方式。有关示例,请参见此链接:androiddesignpatterns.com/2012/05/…
【解决方案2】:

是否有可能由主要活动创建片段 通过布局xmls?

是的,这是一个静态的Fragment。如果你检查布局文件,你应该会看到一个&lt;fragment /&gt; 标签:

<fragment
    android:id="@+id/example_fragment"
    android:name="com.example.staticfragexample.MyFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

然后会有一个对应的MyFragment 类。要访问它,您可以使用getFragmentManager().findFragmentById(R.id.example_fragment);

【讨论】:

  • 其实我不需要获取fragment实例。我对它的加载方式很好。但是,如果它是按照它看起来的方式创建的,我怎么能将参数传递给这个片段呢?为了启动这个片段,我调用了 MainActivity 类,这个片段最终加载。有没有办法通过我对 MainActivity 的调用将参数传递给这个片段?
  • @mayooran 不是现在这样,不。但是,您可以通过 ((MyFragment)getFragmentManager().findFragmentById(R.id.example_fragment)).getView() 更新任何 UI 元素,只要您在 ActivityonCreate() 之后调用它,它将返回 Fragment 的根视图。不过,最简单的答案可能是重写代码以使用动态片段。
【解决方案3】:

您是说片段不是通过 java 代码实例化的。这意味着它们必须已在 xml 中声明,并在像这样创建活动时立即实例化 -

<fragment android:name="com.test.SampleFragment"
          android:id="@+id/sample_fragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

在这种情况下,您不能使用setArguments(),而是使用一些其他机制将数据发送到片段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 2012-02-22
    • 2020-10-26
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多