将多个预先创建的Android活动转换为包含片段的单个活动

时间:2013-11-07 16:48:16

标签: android android-fragments

作为序言;我有一个包含4个活动的Android应用,我希望将这些活动转移到包含片段的两个活动中(两个扩展ListActivity,两个扩展Activity),导航抽屉启用片段之间的导航。我试图将这些活动转变为扩展ListFragmentFragment的活动,但活动中的大部分代码都不再起作用:例如,getSystemService(NOTIFICATION_SERVICE)unbindService和'registerReciever',主要是不同活动中包含的不同onCreateOptionsMenu

因此我问,是否可以将任何单独的活动移植到单个碎片活动中,但仍然保留与单独的重点活动相同的功能,只需最少的编辑?

另外,关于转换过程,是否需要在主Activity中结束前一个Fragment以在同一空间中显示另一个Fragment?

3 个答案:

答案 0 :(得分:0)

从Activity移动代码非常简单。例如,onCreateOptionsMenu也可用于片段中,对于需要上下文或活动的方法,您可以从片段中调用getActivity()以获取对父活动的引用。

编辑:要替换片段,FragmentTransaction类中还有a method,在参数中获取容器View的id。

答案 1 :(得分:0)

是的,片段与活动的生命周期非常相似(See here)。您会发现这可能是从您的活动类复制/粘贴到您的片段类的情况,只需要进行非常小的调整就可以使它们像单独的活动一样工作。您需要做的唯一的工作就是将这些碎片交换到您的活动中。

例如,具有onCreate函数的活动如下所示:

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

    // Find views
    homeMessagesButton = (Button) v.findViewById(R.id.homeMessagesButton);
    homeCreateMatchButton = (Button) v.findViewById(R.id.homeCreateMatchButton);
    homeMyMatchesButton = (Button) v.findViewById(R.id.homeMyMatchesButton);
    homeMyTeamsButton = (Button) v.findViewById(R.id.homeMyTeamsButton);
    homeSquadButton = (Button) v.findViewById(R.id.homeSquadButton);
    homeSettingsButton = (Button) v.findViewById(R.id.homeSettingsButton);

    // Set click listeners
    homeMessagesButton.setOnClickListener(this);
    homeCreateMatchButton.setOnClickListener(this);
    homeMyMatchesButton.setOnClickListener(this);
    homeMyTeamsButton.setOnClickListener(this);
    homeSquadButton.setOnClickListener(this);
    homeSettingsButton.setOnClickListener(this);    
}

现在在片段中看起来像这样(注意片段使用onCreateView生命周期方法在片段将出现的活动内膨胀其视图)

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

    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_home, container, false);     

 // Find views
    homeMessagesButton = (Button) v.findViewById(R.id.homeMessagesButton);
    homeCreateMatchButton = (Button) v.findViewById(R.id.homeCreateMatchButton);
    homeMyMatchesButton = (Button) v.findViewById(R.id.homeMyMatchesButton);
    homeMyTeamsButton = (Button) v.findViewById(R.id.homeMyTeamsButton);
    homeSquadButton = (Button) v.findViewById(R.id.homeSquadButton);
    homeSettingsButton = (Button) v.findViewById(R.id.homeSettingsButton);

 // Set click listeners
    homeMessagesButton.setOnClickListener(this);
    homeCreateMatchButton.setOnClickListener(this);
    homeMyMatchesButton.setOnClickListener(this);
    homeMyTeamsButton.setOnClickListener(this);
    homeSquadButton.setOnClickListener(this);
    homeSettingsButton.setOnClickListener(this);

    return v;
}

通过使用fragmentTransaction管理器来更改活动中的片段,如Android培训网站here

中所示

由于您的服务需要绑定到活动,而不是片段。这变得微不足道,因为片段可以检索它们绑定的活动。例如,片段中使用的以下代码将自动获取它们存在的活动。

getActivity().getSystemService(Context.LOCATION_SERVICE);

答案 2 :(得分:0)

如果要在片段中使用getSystemService(NOTIFICATION_SERVICE),则需要使用活动的上下文。 Context.getSystemService(NOTIFICATION_SERVICE)。有些方法适用于活动,如果你想在别处使用它们,你需要获得上下文。