/**转帖注明出处*/
FragmentArgs开源库的地址:https://github.com/sockeqwe/fragmentargs
FragmentArgs是一个轻量级的开源库,他用来为你的Frgament生成准确java代码,这个库使用简单。下边是使用FragmentArgs的示例代码:
import com.hannesdorfmann.fragmentargs.FragmentArgs;
import com.hannesdorfmann.fragmentargs.annotation.Arg;
public class MyFragment extends Fragment {
@Arg
int id;
@Arg
String title;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
FragmentArgs.inject(this); // read @Arg fields
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
Toast.makeText(getActivity(), "Hello " + title,
Toast.LENGTH_SHORT).show();
}
}
大家会明显的发现使用FragmentArgs后我们少写了很多代码,这就是FrgamentArgs的强大之处。FragmentArgs会为你的Fragment中的注解属性生成样板代码。在你的Activity中你将使用FragmentArgs生成的Builder类代替new MyFragment(int
id,String title)或静态的MyFragment.newInstance(int id,String title)方法。示例代码如下:
public class MyActivity extends Activity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
int id = 123;
String title = "test";
// Using the generated Builder
Fragment fragment =
new MyFragmentBuilder(id, title)
.build();
// Fragment Transaction
getFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment)
.commit();
}
}
你可能注意到Fragment的onCreate()方法里边的FragmentArgs.inject(this)语句。当调用该语句的时候FragmentArgs将会为你的Fragment生成相应的代码。你可能会问那我是不是必须要在我的每一个Fragment的onCreate方法里边都要调用这个方法呀?你并不需要在你的每一个Fragment的onCreate方法里边都调用这个语句,FragmentsArgs.inject(this)语句支持继承,你只需要写一个Fragment基类,在基类的onCreate方法里调用FragmentArgs.inject(this)语句,然后让其它的Fragment继承这个基类就行了。就像下边的代码这样
public class BaseFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
FragmentArgs.inject(this); // 读取 @Arg 属性
}
}
public class MyFragment extends BaseFragment {
@Arg
String title;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
Toast.makeText(getActivity(), "Hello " + title,
Toast.LENGTH_SHORT).show();
}
}
首先我们从网址https://github.com/sockeqwe/fragmentargs处下载代码,解压后的目录如下所示
这里的annotation和processor文件夹是两个项目,processor项目依赖于annotation项目。当你点开annotation目录和processor目录的时候你会发现他们并不是Eclipse项目。我们需要将这里的annotation和processor合并到一个项目里边并生成.jar文件。首先我们先新建一个java项目(注意是java项目不是android项目)
然后我们将annotation目录下的代码拷到刚新建的fragmentargs项目的src目录下(注意拷的时候从com目录开始拷)
然后我们在将processor目录下的代码拷到fragmentargs目录下(注意也是从com目录开始拷)
除此之外我们还需要将路径processor\src\main\resources里边的文件夹META-INF拷到fragmentargs项目的根目录下(即META-INF跟src是同级目录)
下边我们该生成.jar文件夹了。
点击finish后可能会弹出。。不要管他点击ok
现在.jar文件就生成成功了。
现在我们来新建一个android项目,并将生成的.jar文件拷到新建的android项目的libs目录下:
同时需要额外设置的选项有,
1) 工程属性—>java Compiler Annotation Processing 勾选Enable project specific settings,Enable annotation prcessing。
2) 如果需要生成源文件,则可以设置目标文件的存储路径。
3) 在Factory Path中指定annotation processor所在的jar包。
经过上边的一系列设置之后,你就可以使用FragmentArgs库了。但是谷歌提供给开发者的Eclipse默认是没有带Annotation processing的。
解决方法:
需要配置一个插件:
就这些了,用起来确实不fragment加bundle方便。