2012-09-18 16 views
12

मैं वर्तमान में एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं और टुकड़ों और सूची दृश्यों/सूचीफ्रेगमेंट का उपयोग कर रहा हूं। मेरे पास प्रासंगिक क्रियाकलापों जैसे मानक क्रियाकलापों पर काम कर रहे प्रासंगिक क्रिया बार हैं।टुकड़े के साथ प्रासंगिक क्रिया पट्टी का उपयोग

अब मैं एक ही तरह की चीज करने की कोशिश कर रहा हूं लेकिन एक टुकड़े लेआउट पर। मेरे पास एक मुख्य गतिविधि है जो 2 खंडों, खंड ए और खंड बी

फ्रैगमेंट ए सूची सूची फैलता है और इसमें एक सूची दृश्य है जो SQLite डेटाबेस के भीतर डेटा से पॉप्युलेट किया गया है, जिसमें लेआउट के लिए एक्सएमएल को फुलाया जाता है। जब मुझे मानक सूची एक्टिविटी पर काम कर रहे एक प्रासंगिक एक्शन बार मिलते हैं, तो मेरे पास एक क्लास है जो ListView.MultiChoiceModeListener को बढ़ाती है लेकिन यह ListFragment क्लास या मानक गतिविधि के लिए उपलब्ध नहीं है, इसलिए मैं इसे कार्यान्वित करने के लिए कैसे जाउंगा।

मूलभूत चीज़ जो मैं प्राप्त करना चाहता हूं वह तब होता है जब कोई फ्रेगमेंट ए के भीतर सूचीव्यू के भीतर आइटम को लंबे समय तक दबाता है जो सूचीफ्रेगमेंट को बढ़ाता है, एक्शन बार प्रासंगिक रूप से बदलता है और उपयोगकर्ता सूची दृश्य के भीतर से कई आइटम चुन सकता है।

आपकी सहायता के लिए धन्यवाद।

+0

क्या आप एंड्रॉइड संस्करण का समर्थन करने की योजना बना रहे हैं? क्या आप 'एक्शनबार शेरलॉक' लाइब्रेरी का उपयोग करते हैं? – Luksprog

+0

तकनीकी रूप से यह एंड्रॉइड 2.3 और उससे ऊपर का समर्थन करता है, मुझे पता है कि एक्शन बार केवल हनीकॉम के ऊपर काम करते हैं जो ठीक है, क्योंकि मैं कोड विकसित कर रहा हूं ताकि 2.3 या उससे कम का उपयोग करने से ऐप को एक तरफ संभाला जा सके और यदि हनीकॉम या ऊपर का उपयोग किया जाता है तो यह उपयोग कर सकता है एक्शन बार, इसलिए नहीं, मैं एक्शनबैरशेलॉक – Boardy

उत्तर

17

जब मैं एक प्रासंगिक कार्यवाही बार में एक मानक ListActivity मैं एक वर्ग कि ListView.MultiChoiceModeListener का विस्तार है पर काम कर मिल गया है, लेकिन यह एक ListFragment वर्ग या मैं कैसे जाना होगा तो एक मानक गतिविधि के लिए उपलब्ध नहीं है इसे लागू करने के बारे में ।

मुझे नहीं लगता कि MultiChoiceModeListener उपलब्ध नहीं है (शायद मुझे समझ में नहीं आया कि आप क्या करने का प्रयास करते हैं)। आपकी टिप्पणी से मैंने माना कि आप संगतता पैकेज से टुकड़ों का उपयोग करते हैं। नीचे एक उदाहरण है FragmentActivity दो स्थैतिक टुकड़ों के साथ और उनमें से प्रत्येक टुकड़े प्रासंगिक मेनू बार को अपने मेनू विकल्पों के साथ ट्रिगर करता है।

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

और एक Fragment जो एक RadioGroup जो सीएबी जब एक RadioButton चयन किया जाता है चलाता है से बना एक लेआउट है के लिए अन्य टुकड़ा:

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 मुझे यकीन नहीं है कि मैं आपकी टिप्पणी समझता हूं, दो क्रियाएं एक बार में दिखाई देने वाले सलाखों (एक सटीक परिदृश्य समझने में मददगार होगा)। – Luksprog

+0

मेरे पास एक और समस्या थी> _ <, प्रासंगिक एक्शनबार ठीक से ओवरले नहीं किया गया था, यहां देखें: http://stackoverflow.com/q/26443403/969325 – Warpzit

संबंधित मुद्दे