你可以在多个活动中重用一个片段但具有不同的功能吗?

时间:2017-11-15 23:11:46

标签: android android-fragments android-activity

假设我有一个包含三个按钮的片段,我想重复使用它至少三个活动,但我希望这些按钮为每个活动做不同的事情。例如,在ActivityA中,我希望button1打开Goog​​le地图,而在ActivityB中,button1会转到音乐播放器。这有可能,甚至是正确的方式吗?

5 个答案:

答案 0 :(得分:2)

当然可以。只需使用您想要的回调方法FragmentCallback为Fragment创建一个接口,例如onButtonClick()。在片段的onAttached()中,将Activity转换为新界面并将其存储在变量private FragmentCallback callback;中。使用此Fragment的每个Activity都必须实现此回调接口。然后在Fragments onButtonClick()方法中调用回调onButtonClick()方法。就是这样 - 一种非常常见的模式。

答案 1 :(得分:1)

  

这可能吗?

它定义为。您可以检查哪个Activity正在托管您的Fragment实例:

private void button1OnClick(){
 /* could also use instanceof, BUT: if you have something like ActivityC extends ActivityA 
         then instanceof would evaluate to true for both */
   if(getActivity().getClass().equals(ActivityA.class)) {
     // do stuff
   } else if(getActivity().getClass().equals(ActivityB.class)) {
     // do another stuff
   }
}
  

这是正确的方法吗?

注意力的回答) 这取决于。如果您有复杂而独特的布局/功能,我会使用不同的Fragments。如果你有一个简单的布局,其中一些按钮只需要在不同的Activities中采取不同的行动,那么重用现有的Fragment类是个好主意。

答案 2 :(得分:1)

是的,你可以,但你必须为你的片段添加更多的逻辑,并为每个活动添加一些接口。 我不建议这样做,也许你可以重用你的布局。

答案 3 :(得分:0)

是的,你可以!

if(getActivity() instanceOf ActivityA) {
    //do stuff related to ActivityA
} else if(getActivity() instanceOf ActivityB) {
    //do stuff related to ActivityB
}

答案 4 :(得分:0)

您的活动有不同的逻辑,您可以在每个活动中定义按钮逻辑并以这种方式共享视图。您可以使用片段来完成此操作,但是通过共享部分布局可以更直接。

创建名为three_buttons.xml的部分布局

three_buttons.xml

<LinearLayout>
<BUtton android:text="button 1"/>
<BUtton android:text="button 2"/>
<BUtton android:text="button 3"/>
</LinearLayout>

activity_a.xml

<LinearLayout>
<TextView android:text="I am A"/>
<include
            android:id="@+id/three_buttons"
            layout="@layout/three_buttons"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
</LinearLayout>

activity_b.xml

<LinearLayout>
<TextView android:text="I am B"/>
<include
            android:id="@+id/three_buttons"
            layout="@layout/three_buttons"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
</LinearLayout>