创建片段而不从 java 代码实例化它

Posted

技术标签:

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

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

【问题讨论】:

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

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

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

<fragment android:name="com.example.android.fragments.HeadlinesFragment"
          android:id="@+id/headlines_fragment"
          android:layout_weight="1"
          android:layout_
          android:layout_ />

<fragment android:name="com.example.android.fragments.ArticleFragment"
          android:id="@+id/article_fragment"
          android:layout_weight="2"
          android:layout_
          android:layout_ />

</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_
    android:layout_ />

然后会有一个对应的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_
          android:layout_ />

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

【讨论】:

以上是关于创建片段而不从 java 代码实例化它的主要内容,如果未能解决你的问题,请参考以下文章

我为一个类声明了一个变量,并将其传递给一个方法来实例化它,但原始变量仍未实例化

PHP单例模式简记

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

创建片段的新实例时菜单未膨胀

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

NodeJS构造自定义对象而不需要该文件