作为序言;我有一个包含4个活动的Android应用,我希望将这些活动转移到包含片段的两个活动中(两个扩展ListActivity
,两个扩展Activity
),导航抽屉启用片段之间的导航。我试图将这些活动转变为扩展ListFragment
和Fragment
的活动,但活动中的大部分代码都不再起作用:例如,getSystemService(NOTIFICATION_SERVICE)
,unbindService
和'registerReciever',主要是不同活动中包含的不同onCreateOptionsMenu
。
因此我问,是否可以将任何单独的活动移植到单个碎片活动中,但仍然保留与单独的重点活动相同的功能,只需最少的编辑?
另外,关于转换过程,是否需要在主Activity中结束前一个Fragment以在同一空间中显示另一个Fragment?
答案 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)。有些方法适用于活动,如果你想在别处使用它们,你需要获得上下文。