2012-09-18 11 views
12

Şu anda android projesi üzerinde çalışıyorum ve parçaların ve ListViews/ListFragments'ın kullanımı üzerinde çalışıyorum. ListActivity gibi standart aktiviteler üzerinde çalışan bağlamsal eylem çubuklarım var.Contextual action bar öğelerini fragmanlarla kullanma

Şimdi aynı tür bir şeyi yapmaya çalışıyorum ama bir parça düzeni üzerinde. I2 fragmanları, fragman A ve B parçası içeren bir düzen için, XML şişirir Aktivite uzanan bir MainActivity sahip Parçacık A ListFragment uzanır ve SQLite Veritabanı içinde veri doldurulur bir ListView içerir

. Standart bir ListActivity üzerinde çalışan bir bağlamsal eylem çubuğuna sahip olduğumda, ListView.MultiChoiceModeListener öğesini genişleten bir sınıfım var ancak bu bir ListFragment sınıfı veya standart bir etkinlik için mevcut değil, bu yüzden bunu uygulamak için nasıl giderim.

Kazanmak istediğim temel şey, birisinin ListFragment öğesini genişleten FragmentA içindeki bir ListView içindeki öğeye uzun süre basması, eylem çubuğunun bağlamsal olarak değişmesi ve kullanıcının ListView içinden birden çok öğe seçebilmesidir.

Sağladığınız her türlü yardım için teşekkür ederiz. Ben ListView.MultiChoiceModeListener Uzattı bir sınıf var standart ListActivity üzerinde çalışan bir bağlamsal işlem çubuğunu var ama bu ListFragment sınıf veya ben giderdim nasıl bir standart aktivite için kullanılamaz

+0

Hangi Android sürümünü desteklemeyi planlıyorsunuz? 'ActionBarSherlock' kütüphanesini kullanıyor musunuz? – Luksprog

+0

Teknik olarak Android 2.3 ve üstünü destekler, ben eylem çubukları sadece ben geliştiriyorum, çünkü ben geliştiriyorum çünkü ben geliştirmek için bir şekilde bal peteği veya yukarıda kullandıktan sonra 2.3 veya altında kullanırsanız, kola gelişmekte olan, petek yukarı doğru çalışır biliyorum eylem çubuğu, bu yüzden ben ActionBarSherlock kullanmıyorum – Boardy

cevap

17

Bunu uygulayan yaklaşık .

MultiChoiceModeListener'un nasıl kullanıldığını göremiyorum (belki de ne yapmaya çalıştığınızı anlamadım). Yorumunuzdan, uyumluluk paketindeki parçaları kullandığınızı varsaydım. Aşağıda, iki statik parça içeren bir FragmentActivity örneğidir ve bu parçaların her biri, bağlamsal eylem çubuğunu kendi menü seçenekleri ile tetikler.

// 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!"); 
      } 
     }); 
    } 
} 

ve RadioButton seçilir CAB tetikleyen bir RadioGroup den oluşan bir düzene sahip bir Fragment diğer parçası:

FragmentActivity sadece aşağıdaki iki fragman tutan, çok basittir: Bu size (eğer düzenleri ve menüler dosyaları in my github project dahil olmak üzere tam bir örnek bulabilirsiniz) aradığınızı ise

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; 
    } 
} 

bakınız.

+0

Ama eğer normal eylem çubuğunu uygulayan parça ise bir kerede 2 eylem çubuğunu elde edersiniz :) – Warpzit

+0

@Warpzit Yorumunuzu anladığımdan emin değilim, iki eylem Bir kerede görünen çubuklar (tam bir senaryo anlamak için yardımcı olacaktır). – Luksprog

+0

Başka bir sorunum var> _ <, içeriğe dayalı eylem çubuğu düzgün bir şekilde yerleşmedi, bkz. Http://stackoverflow.com/q/26443403/969325 – Warpzit