2012-09-18 6 views
12

私は現在、アンドロイド・プロジェクトとフラグメントとListView/ListFragmentsを使用しています。 ListActivityなどの標準的なアクティビティを処理するコンテキストアクションバーがあります。フラグメント付きコンテキスト・アクション・バーの使用

今、私は同じ種類のことをしようとしていますが、断片的なレイアウトにしています。私は2つのフラグメント、フラグメントAとフラグメントBを含むレイアウトのXMLを膨張させるMainActivityを持っています。

フラグメントAはListFragmentを拡張し、SQLiteデータベース内のデータから読み込まれたListViewを含んでいます。標準のListActivityで動作するコンテキストアクションバーがある場合、ListView.MultiChoiceModeListenerを拡張するクラスがありますが、これはListFragmentクラスまたは標準アクティビティでは使用できません。これを実装するにはどうすればよいでしょうか。

私が達成したい基本的なことは、誰かがListFragmentを拡張するFragmentA内のListView内の項目を長押しすると、アクションバーがコンテキスト変更され、ユーザーがListView内から複数の項目を選択できることです。

ご協力いただきありがとうございます。私は ListView.MultiChoiceModeListenerを拡張するクラスを持っている標準 ListActivityに取り組ん文脈アクションバーを持っているが、これは ListFragmentクラスまたはので、私は行くだろうか、標準的な活動のために利用できない

+0

どのAndroid搭載版をサポートしますか?あなたは 'ActionBarSherlock'ライブラリを使いますか? – Luksprog

+0

技術的には、Android 2.3以上をサポートしています。アクションバーは、ハニカムを上向きにしか動かないことを知っています。コードを開発しているので、アプリを片方向で扱い、ハニカム以上を使用するとアクションバー、だから私は使用していないいいえActionBarSherlock – Boardy

答えて

17

約 これを実装します。

MultiChoiceModeListenerは利用できません(多分私はあなたがしようとしていることを理解できませんでした)。あなたのコメントから、互換性パッケージのフラグメントを使用すると仮定しました。 以下は、2つの静的フラグメントを持つFragmentActivityの例です。これらのフラグメントのそれぞれは、独自のメニューオプションでコンテキストアクションバーをトリガーします。

// the list fragment 
public class ListCABFragment extends ListFragment { 

    private String[] mCountries = { "Romania", "Germany", "England", "USA", 
      "Japan", "France" }; 
    private static final boolean POST_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (POST_HONEYCOMB) { 
      // make sure we are on a version above Honeycomb otherwise will 
      // access things that aren't available 
      postHoneycombCAB(); 
     } else { 
      // probably do nothing and implement the normal context menu?!? 
     } 
     setListAdapter(new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, mCountries)); 
    } 

    @SuppressLint({ "NewApi", "NewApi" }) 
    private void postHoneycombCAB() { 
     getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
     getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       ((ListView) parent).setItemChecked(position, 
         ((ListView) parent).isItemChecked(position)); 
       return false; 
      } 
     }); 
     getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() { 

      private int nr = 0; 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
       getActivity().getMenuInflater().inflate(R.menu.listcab_menu, 
         menu); 
       return true; 
      } 

      @Override 
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
       return false; 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       switch (item.getItemId()) { 
       case R.id.item1: 
        Toast.makeText(getActivity(), "Option1 clicked", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case R.id.item2: 
        Toast.makeText(getActivity(), "Option2 clicked", 
          Toast.LENGTH_SHORT).show(); 
        break; 

       } 
       return false; 
      } 

      @Override 
      public void onDestroyActionMode(ActionMode mode) { 
       nr = 0; 
      } 

      @Override 
      public void onItemCheckedStateChanged(ActionMode mode, 
        int position, long id, boolean checked) { 
       if (checked) { 
        nr++; 
       } else { 
        nr--; 
       } 
       mode.setTitle(nr + " rows selected!"); 
      } 
     }); 
    } 
} 

RadioButtonが選択されているCABをトリガRadioGroupからなるレイアウトを有するFragmentするための他のフラグメント:

FragmentActivityはそれだけ下の2つの断片を保持する、非常に単純です。

public class SimpleCABFragment extends Fragment implements Callback { 

    private static final boolean POST_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.frag_simplecabfragment, container, 
       false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     RadioGroup rg = (RadioGroup) getView().findViewById(R.id.radioGroup1); 
     rg.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       if (POST_HONEYCOMB) { 
        // this could be improved so we don't need to create the 
        // option 
        // menu if it is already available 
        getActivity().startActionMode(SimpleCABFragment.this); 
       } else { 
        // something else 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     if (item.getItemId() == R.id.itemradio) { 
      Toast.makeText(getActivity(), "CAB for Radiogroup!", 
        Toast.LENGTH_SHORT).show(); 
     } 
     return false; 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     getActivity().getMenuInflater().inflate(R.menu.simplecab_menu, menu); 
     return true; 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 
} 

これはあなたが探しているものであれば(あなたがレイアウトやメニューファイルin my github projectを含む完全なサンプルを見つけることができます)を参照してください。

+0

しかし、これは通常のアクションバーを実装するフラグメントであれば、一度に2つのアクションバーが表示されます:) – Warpzit

+0

@Warpzit私はあなたのコメント、2つのアクションすぐに表示されるバー(正確なシナリオは理解するのに役立ちます)。 – Luksprog

+0

別の問題が発生しました> _ <、コンテキストのアクションバーが正しくオーバーレイされませんでした。http://stackoverflow.com/q/26443403/969325 – Warpzit

関連する問題