原英文链接:Fragments in Android Studio
这篇指南将会教你在Android Studio上简单地创建和使用Fragment,并在fragment里添加一个按钮,点击按钮会发送一个个动作给持有该fragment的父activity,并且显示一个Toast通知。
Getting Started
打开Android Studio 并且点击“File -> New Project”,会打开新建项目的向导窗口。在窗口中为你的app命名为“FragmentExample”。
在往下深入之前,要说明下,在新建项目向导窗口的底部有个“Support Mode”选项。如果你想要在Pre-Honeycomb(3.0之前的版本)设备上使用fragemnt,你就会用到“Support Mode”选项来确保fragemnts向后(下)兼容(fragmetns是在3.0及之后才有的,所以在3.0以前的版本需要使用v4包里的fragemnt,选择了fragemnt的选项即使在低版本的sdk下也会自动提供支持fragment的库文件)。
Android Studio project wizard
现在我先不选择“Support Mode”里的选项,而是手动选择API Level到Honeycomb:
像上面那样操作完后,“Support Mode”里Fragment选项会自动消失。一直点击“Next”,直到得到如下面的截图内容:
正如你说看到的那样,Android Studio会自动生成一个Fragment。然后由于我们要学习fragment的使用,我们将要创建和修改我们自己自定义的fragment。
What is a Fragment in Android Studio?
在Android中,一个Fragemnt是一个在Activity里表示行为或用户界面的一部分的类。Fragemtn被用来生成UI,可以适应各种各样的设备方向,以及无缝地适应手机和平板。你甚至可以咋同一个activity里使用多个fragments以及当用户选择设备时重新排列他们。
Android Studio可以生成多种类型的fragments:ListFragments,可以以列表的形式显示数据项或者表格的形式和“基本的”经常控制一个简单布局的fragments。今天我们只谈论最基本的fragment。
用Android Studio生成Fragment
先来熟悉Android Studio怎样来创建新的fragments以及其布局需求。
首先,在你要生成fragment的文件夹上右击,选择“New -> Android Component”。
然后,你会看到Android Component生成向导。继续选择“New Blank Fragment”。像下图所示,提示你生成一个布局文件以及一些基本的工厂方法和回调。
接着,给fragment明明为“BlankFragment”或者随便你想叫什么都可以。勾选"Create layout XML"和其他工程方法。
操作顺利,新的fragment和他的布局文件就会在项目中被创建,如下图:
打开“fragment_blank.xml”,你会看到下面的内容:
(只是一个简单的FramLayout带有一个TextView,该TextView显示“Hello blank fragment”)
添加一个Button到Fragment
我们的fragment现在很不耐烦了,开始添加一个按钮和交互吧。
在Android Studio “design”预览中,选择"fragment_blank.xml"文件,拖动一个按钮到中心位置。把按钮上的文字修改为“Wheee!”,这样会在BlankFragment中生成一个id为button的按钮。
打开BlankFragment关联的类,像下面一个添加和修改内容。基本上就是从布局文件中取出按钮,然后给他添加监听:
private Button mButton; //Add at the top of the fragment
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = null;
view = inflater.inflate(R.layout.fragment_blank, container, false);
mButton = (Button) view.findViewById(R.id.button);
mButton.setOnClickListener(this);
return view;
}
操作完后,Android Studio会抛出一个警告:你还未实现Button.OnClickListener。解决这个问题,要在BlankFragment类的署名上添加"implements Button.OnClickListener":
private Button mButton; //Add at the top of the fragment
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = null;
view = inflater.inflate(R.layout.fragment_blank, container, false);
mButton = (Button) view.findViewById(R.id.button);
mButton.setOnClickListener(this);
return view;
}
Once you have done that and hit “save,” Android
Read more at http://www.airpair.com/android/fragments-android-studio#bQriuvchXAtfv2tf.99
private Button mButton; //Add at the top of the fragment
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = null;
view = inflater.inflate(R.layout.fragment_blank, container, false);
mButton = (Button) view.findViewById(R.id.button);
mButton.setOnClickListener(this);
return view;
}
Once you have done that and hit “save,” Android
Read more at http://www.airpair.com/android/fragments-android-studio#bQriuvchXAtfv2tf.99
现在在类的底部会生成这个方法,警告也随之消除了。
public void onClick(View v){
//Nothing here yet
}
现在我们可以监听到按钮"Whee"的点击事件了。
Fragments和Activities之间的通讯
经常会有这种个情况,即我们想要知道在activity中的fragment发生了什么,其中一种方法就是使用熟悉的代理模式——持有父Activity的引用用来传递信息。
幸运的是,Android Studio已经自动为我们生成了代理。如果看"BlankFragment"的顶部,你会看到:
private OnFragmentInteractionListener mListener;
往下,你还会看到:
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
这就是我们所需要的基本方法,当点击“Whee”按钮时会发送消息给我们的activity。
在Activity中创建Fragments
回到项目的根Activity“MainActivity”,当MainActivity加载时我们想要发生的第一件事是添加BlankFragment到该activity中,方便用户可以看到fragment中发生了什么。
在onCreate()方法中添加/更新如下代码,去指定BlankFragment作为默认的fragment:
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.add(R.id.container, new BlankFragment())
.commit();
}
}
Side Note:注意Android Studio仍然是默认使用的“support”库,通过“getSupportFragmentManager”。如果你瞄准的是未来的Android API(
Read more at http://www.airpair.com/android/fragments-android-studio#ebkLGJp9sibvqyRK.99
Read more at http://www.airpair.com/android/fragments-android-studio#ebkLGJp9sibvqyRK.99
Read more at http://www.airpair.com/android/fragments-android-studio#ebkLGJp9sibvqyRK.99
接下来,我们需要对我们FragmentActivity进行一些修改。
首先,在类MainActivity的署名边上添加“implements BlankFragment。OnFragemntInteractionListener”,然后在MainActivity的某个地方会添加如下的方法:
public void onFragmentInteraction(Uri uri){
Toast toast = Toast.makeText(this, "Wheeee!",Toast.LENGTH_SHORT);
toast.show();
}
接着,观察在Android Studio中自动生成的“onAttach”方法。mListener对象被自动指定给父activity,所以我们不需要再去进一步操作:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
最后,修改按钮的监听方法:
public void onClick(View v){
mListener.onFragmentInteraction(null);
}
现在,当你运行该Android应用时,点击“Whee”按钮,一个Toast会弹出来并显示“Wheee”。