1

既存のAndroidアプリケーションをフラグメントレイアウトに変換することを計画しています。

アイデアは、古典的な2つのパネルレイアウト(左側にアイテムリスト、右側に詳細)を用意することです。

実際、アプリケーションは4つのアクティビティで構成されています。

  1. 利用可能なすべてのオプションを備えたChoiceListActivity
  2. ツールで使用可能な操作ごとに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);
    }

}

そのフラグメントがパネルの左側になります。

私の問題は右側にあります。リストのすべての要素について、対応するアクティビティ(またはフラグメント?)が表示されるという考え方です。

では、正しい方法は何ですか?

  1. ユーザーがアイテムを選択したときに、適切なフラグメントでアクティビティを開始することをお勧めしますか?

  2. または、プログラムでフラグメントを切り替える必要がありますか?そしてそれを行う方法(私は多くのチュートリアルを見つけましたが、それらは常に同じアクティビティを使用して、右側のパネル内のいくつかのデータを変更します)?

正しいフラグメント用に次のクラスを作成しました(ただし、正しく実行しているかどうかはわかりません)。

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> 
4

2 に答える 2

1

わかりました。解決策を見つけました。最初ははっきりしませんでしたが、いくつかのドキュメントを読んだり、多くのチュートリアルを見たりすると、それがどのように機能するかを理解しているかもしれません。

まず、レイアウトから2番目のフラグメント* right_fragment *を削除し(質問を確認してください)、フラグメントのコンテナーとなる*activity_container*という空のFrameLayoutに置き換えました。

背後にある考え方は、FragmentManagerを使用してコンテナ内のフラグメントを置き換えることです。

そこで、onListItemClickメソッドをChoiceListFragmentに更新し、タップされたリストアイテムに応じて、新しいFragmentを作成し、それを*activity_container*に置き換えます。更新されたメソッドは次のようになります。

public void onListItemClick(ListView l, View v, int position, long id) {            
        String itemName = getListView().getItemAtPosition(position).toString();
        switch(position){
        case OPTION_ONE:                getFragmentManager().beginTransaction().replace(R.id.activity_container, new OptionOneFragment()).commit();
            break;
        case RESISTOR_VALUE:
            getFragmentManager().beginTransaction().replace(R.id.activity_container, new OptionTwoFragment()).commit();
            break;
        default:
            Toast.makeText(getActivity(), getListView().getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show();
            break;
        }       
        super.onListItemClick(l, v, position, id);
    }

このように、アプリケーションのすべてのコンポーネントには、異なるクラスによって処理される独自のフラグメントがあります。

于 2013-03-08T23:28:20.370 に答える
0

あなたは正しい方向に進んでいます。小さな画面では、リストアイテムをクリックすると、DetailFragmentの単純なラッパーであるDetailActivityが開始されます。より大きな画面で、リストアイテムをクリックすると、右側がDetailFragmentの新しいインスタンスに置き換えられます。

eclipseとADTを使用している場合は、新しいAndroidプロジェクトまたは新しいAndroidアクティビティを作成することでアクセスできるMasterDetailFlowテンプレートを確認することをお勧めします。

于 2013-03-08T18:42:13.240 に答える