在活动

时间:2018-03-18 16:05:25

标签: android android-fragments android-architecture-components

我有一个有两个按钮的SchoolActivity: -Primary(添加PrimaryFragment) -Secondary(添加SecondaryFragment)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.yuv.mycollege.MainActivity">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    <Button
        android:id="@+id/button_primary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Primary"/>

    <Button
        android:id="@+id/button_secondary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Secondary"/>
    </LinearLayout>

    <!-- Main content area for fragments-->
    <FrameLayout
        android:background="@color/colorPrimary"
        android:id="@+id/main_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:padding="4dp"/>

</LinearLayout>

这两个片段都有内容和页脚区域,它们本身就是片段(PrimaryContentFragment,PrimaryFooterFragment,SecondaryContentFragment,SecondaryFooterFragment)

我使用以下方法添加活动中的片段:

public void onClick(View view) {
    Button button = (Button)view;
    Toast.makeText(this, "Going to Add Children", Toast.LENGTH_SHORT).show();

    switch(view.getId()) {
        case R.id.button_primary:
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main_container, new PrimaryFragment())
                    .addToBackStack("primary")
                    .commit();
            break;
        case R.id.button_secondary:
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main_container, new SecondaryFragment())
                    .addToBackStack("secondary")
                    .commit();
            break;
    }
}

最后,使用以下方法添加每个子片段: 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <FrameLayout
        android:id="@+id/content_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@color/colorAccent"
        android:layout_weight="8"
        ></FrameLayout>

    <FrameLayout
        android:id="@+id/footer_container"
        android:background="@color/colorPrimaryDark"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        ></FrameLayout>
</LinearLayout>

儿童片段添加:

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.primary_fragment, container, false);
        getChildFragmentManager()
                .beginTransaction()
                .add(R.id.content_container, new PrimaryContentFragment())
                .add(R.id.footer_container, new PrimaryFooterFragment())
                .addToBackStack("primarychildren")
                .commit();

        return view;
    }

我正在为另一个片段添加类似的逻辑,依此类推其余的工作。

问题: 如上所述的解决方案是有效的,但似乎是非常原始的天真方法。任何人都可以提出我可以遵循的更好的架构,例如:

  • 所有片段(Primary / Secondary / ...)使用相同的设计 我可以创建一些基类来继承常用功能
  • 所有片段的所有页脚都相似,但文本更改很简单 (可能就像面包屑一样)所以,我可以为所有人使用相同的页脚 一些settext方法的片段...
  • 如何在活动和片段之间进行有效沟通

成为一个新的安卓设备,我唯一关心的是我做正确的方式!!!

2 个答案:

答案 0 :(得分:0)

使用bundle

尝试此操作
  ContentFragment content=new ContentFragment();
  content.setArguments( ( new Bundle()).putString("value","primary"));

getChildFragmentManager()
            .beginTransaction()
            .add(R.id.content_container, content)
            .add(R.id.footer_container, new PrimaryFooterFragment())
            .addToBackStack("primarychildren")
            .commit();

同样适合二次使用: -

  ContentFragment content=new ContentFragment();
  content.setArguments( ( new Bundle()).putString("value","secondary"));
  

使用相同的contentfooter片段,只需使用bundle arguments

设置文字

答案 1 :(得分:0)

  

所有片段(Primary / Secondary / ...)都使用相同的设计   我创建了一些基类来继承常用功能

如果他们使用相同的设计并且内容稍有变化,那么就不需要创建不同的Fragment类。您只需从调用ActivityFragment传递必要的值即可填充每个子片段中的内容。

  

所有片段的所有页脚都相似但文本简单   改变(可能像breadcrumb)所以,我可以使用相同的页脚   使用某种settext方法的片段......

如果它们只是简单的文字更改,那么请使用setArgumentsgetArguments方法在Fragment之间传递值,而不是创建不同的Fragment类。

以下是pass values between fragments的方法。这就是你can pass data from your Activity to Fragment的方式。

  

如何在活动和片段之间进行有效沟通

请按照上面的两个链接在ActivityFragment之间进行通信。

<强>更新

跟进评论,正如您所说PrimaryFragmentSecondaryFragment很可能,我建议你让一个Fragment拥有所有这些。您可以考虑使用具有页脚PrimaryFragment的单个SecondaryFragment,而不是CommonFragmentFragmentFragment。当您要启动该Fragment的实例时,只需传递必要的值以将数据填充为Fragment的内容。

如果我没有说清楚,请告诉我。