既存のAndroidアプリケーションをフラグメントレイアウトに変換することを計画しています。
アイデアは、古典的な2つのパネルレイアウト(左側にアイテムリスト、右側に詳細)を用意することです。
実際、アプリケーションは4つのアクティビティで構成されています。
- 利用可能なすべてのオプションを備えたChoiceListActivity
- ツールで使用可能な操作ごとに1つずつ、3つの異なるアクティビティ。
今、私は変換に取り組み始め、メインクラスであるFragmentActivityクラスを作成しました:
public class MainFragment extends FragmentActivity {
private static final String TAG = "MainFragment";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
if(findViewById(R.id.fragment_container)!=null){
Log.i(TAG, "No Tablet");
Intent i = new Intent(MainFragment.this, main.ChoiceActivity.class);
startActivity(i);
} else {
Log.i(TAG, "Tablet");
}
}
}
そして、ChoiceListFragmentを作成しました: `
public class ChoiceListFragment extends ListFragment {
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Toast.makeText(getActivity(), getListView().getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show();
super.onListItemClick(l, v, position, id);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String[] options = getResources().getStringArray(R.array.listitems);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(inflater.getContext(), R.layout.list_item, options);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
}
そのフラグメントがパネルの左側になります。
私の問題は右側にあります。リストのすべての要素について、対応するアクティビティ(またはフラグメント?)が表示されるという考え方です。
では、正しい方法は何ですか?
ユーザーがアイテムを選択したときに、適切なフラグメントでアクティビティを開始することをお勧めしますか?
または、プログラムでフラグメントを切り替える必要がありますか?そしてそれを行う方法(私は多くのチュートリアルを見つけましたが、それらは常に同じアクティビティを使用して、右側のパネル内のいくつかのデータを変更します)?
正しいフラグメント用に次のクラスを作成しました(ただし、正しく実行しているかどうかはわかりません)。
public class RightFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.main, container, false);
}
}
onCreateメソッド中にLayoutInflaterオブジェクトを使用して最終的にレイアウトを変更できることに気付きましたが、これは単に画面上のレイアウトを変更します。レイアウトで宣言されたオブジェクトは初期化されません(eventListenerが追加されないなど)。それで、それをどのように行うのですか?
たぶん、インテントを作成し、startActivityを使用して既存のアクティビティを起動する必要がありますか、それともこれは断片化するのは悪い考えですか?
実際のxmlレイアウトは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<fragment
android:id="@+id/choicelist_fragment"
android:name="main.fragments.ChoiceListFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<fragment
android:id="@+id/right_fragment"
android:name="main.fragments.RightFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
</LinearLayout>