/**轉帖註明出處*/
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方便。