- 公開日:2015年08月08日
記事概要
Android StudioでFragmentの自動生成を利用した時の対応と、その対応で思ったことのまとめ記事です。
環境
- Android Studio 1.3.0
- OS X Yosemite
Fragmentの自動生成
久しぶりのAndroidアプリ開発でAndroid Studioのバージョンを1.3.0にあげました。
Fragmentの自動生成機能を利用したところ、以下の様なコードが出力されました。
public class SampleFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment SampleFragment.
*/
// TODO: Rename and change types and number of parameters
public static SampleFragment newInstance(String param1, String param2) {
SampleFragment fragment = new SampleFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public SampleFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_test, container, false);
return view;
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
}
なにこれ…。
自動生成ってレベルじゃねえぞ!!
onAttachメソッドを呼び出してActivityとFragmentの関連付けまでやっています。
すごい、すごすぎる。
さっそく利用するActivityを書き換えてアプリを動かしたところで、ふと思いました。
これって便利だけど、初心者じゃわからなくないのかなそう思いググってみたところ、案の定、結構な開発者が苦労しているのが散見されました。
Fragmentの対応方法
自動生成された上記のFragmentをActivityで利用するには、下記のような実装が必要になります。
public class TestMainActivity extends AppCompatActivity implements SampleFragment.OnFragmentInteractionListener {
// something
@Override
public void onFragmentInteraction(Uri uri) {
}
}
要は、XXXFragmentで実装したインターフェースをXXXAcitivtyで実装しないといけません。
Javaの経験者ならそれくらい常識だろうと思うかもしれませんが、Fragmentが導入されるようになったのは Activityでの実装が当たり前になってしまった後であり、Fragmentを未だによく理解していない開発者が多いのが現状です。
まとめ
私は最近xcodeとswiftでiphoneアプリの開発を行っています。
そこで思うのは、iphoneアプリの開発難易度は楽になったということです。
初めてiphoneアプリ開発に携わった時は、objective-cとxcodeの挙動に気が狂いそうになるくらい苦しめられました。 でも、今はバージョンアップしても「うん。これは良い機能だ」と思えるくらいに余裕が出てきました。
逆にandroidの開発は大変になったと思います。android開発にも様々な機能が導入され、便利になったのは確かです。
しかし、その便利を享受するために求められる知識量と学習量のバランスが取れなくなっている気がします。
androidは世界中で多くのシェアを獲得しました。だからこそ、もうちょっと開発者に配慮した環境を用意して欲しいと思います。コンテンツをつくるのは我々開発者なわけですから。
以上
Androidアプリ開発にオススメの本
開発にあると便利なオススメ製品
関連記事 参考サイト
0 件のコメント:
コメントを投稿