2011-10-22 16 views
16
की, मैं अपने 1.6 (डोनट) के लिए Android संगतता लाइब्रेरी V4 rev.3 उपयोग कर रहा हूँ

सूची लेआउट में list_content ListFragment कार्यक्षमता बनाए रखने के लिए सहित

जब आप पहली बार एक ListFragment बनाने यह एक indeterminant प्रगति संकेतक तक प्रदर्शित करता है

पहले आप setListAdabpter() का उपयोग करते हैं। ListFragment.onCreateView के प्रलेखन के अनुसार, अगर मैं एक कस्टम का उपयोग करना चाहते बाहर रखना:

आप अपने स्वयं के कस्टम सामग्री के साथ इस विधि अधिभावी रहे हैं, तो मानक लेआउट शामिल करने पर विचार {@link android.R अपनी लेआउट फ़ाइल में .layout # list_content}, ताकि आप ListFragment के सभी मानक व्यवहार को बनाए रखना जारी रख सकें। विशेष रूप से, यह वर्तमान में अंतर्निहित अनिवार्य प्रगति स्थिति दिखाने का एकमात्र तरीका है। <include layout="@android:layout/list_content" ...> यह (ग्रहण) मुझसे कहता है कि

संसाधन सार्वजनिक नहीं है:

समस्या यह है कि जब मैं अपने लेआउट फ़ाइल में जाने के लिए और कोशिश है। (मूल्य '@android: लेआउट/list_content' के साथ 'लेआउट' पर)।

मुझे लगता है कि list_content.xml मेरे वी 4 स्रोत कोड में मौजूद नहीं है। जो सही है क्योंकि डॉक्स के अनुसार यह एपीआई v11 में दिखाई दिया।

मैं सिर्फ यह संगतता पुस्तकालय स्रोत में मौजूद होता है, पता नहीं है अगर यह होता है मान लिया ...

केवल अन्य समाधान मैं देख सकता हूँ एंड्रॉयड के एपीआई V11 स्रोत कोड खुदाई और कॉपी और पेस्ट करने के लिए किया जाएगा list_content.xml। अभी के लिए हालांकि मैं इस हैकरी से बचना चाहता हूं। क्या यह एकमात्र समाधान है?

+0

क्या आपको इसका समाधान मिला? मुझे भी यही तकलीफ़ है। – Yuyo

+0

@Yuyo मैंने कस्टम लेआउट (आलस्य वास्तव में) का उपयोग नहीं किया, लेकिन मेरे और एंटोनिटे ने कहा कि आप अपनी प्रोजेक्ट में 'list_content.xml' की प्रतिलिपि बना सकते हैं। यह वास्तव में हैकरी नहीं है यदि आप एक ही प्रभाव को पूरा करने के लिए कोड की रेखाएं लिखना शुरू नहीं करना चाहते हैं तो यह करने का सबसे अच्छा तरीका है। –

उत्तर

8

संगतता लाइब्रेरी में शामिल ListFragment उस लेआउट (list_content) को असली के रूप में उपयोग करने के लिए प्रतीत नहीं होता है। ऐसा इसलिए हो सकता है क्योंकि इसे जार के रूप में पेश किया जाता है और संसाधनों को पैकेज करना संभव नहीं है।

संगतता पुस्तकालय से ListFragment:: Android 4.0 से

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    final Context context = getActivity(); 

    FrameLayout root = new FrameLayout(context); 

    // ------------------------------------------------------------------ 

    LinearLayout pframe = new LinearLayout(context); 
    pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID); 
    pframe.setOrientation(LinearLayout.VERTICAL); 
    pframe.setVisibility(View.GONE); 
    pframe.setGravity(Gravity.CENTER); 

    ProgressBar progress = new ProgressBar(context, null, 
      android.R.attr.progressBarStyleLarge); 
    pframe.addView(progress, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

    root.addView(pframe, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    // ------------------------------------------------------------------ 

    FrameLayout lframe = new FrameLayout(context); 
    lframe.setId(INTERNAL_LIST_CONTAINER_ID); 

    TextView tv = new TextView(getActivity()); 
    tv.setId(INTERNAL_EMPTY_ID); 
    tv.setGravity(Gravity.CENTER); 
    lframe.addView(tv, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    ListView lv = new ListView(getActivity()); 
    lv.setId(android.R.id.list); 
    lv.setDrawSelectorOnTop(false); 
    lframe.addView(lv, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    root.addView(lframe, new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    // ------------------------------------------------------------------ 

    root.setLayoutParams(new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

    return root; 
} 

ListFragment: यहाँ अपने onCreateView की सामग्री हैं

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

APIv11 स्रोत से लेआउट फ़ाइल को कॉपी करने और इस सहित के बीच विकल्प को देखते हुए प्रारंभिक कोड देखें, मुझे लगता है कि यह स्पष्ट है कि जिसे 'हैकरी' माना जाएगा;)

1

एक possib le काम के आसपास डिफ़ॉल्ट @ android.R.layout/list_content शामिल करने के लिए कस्टम लेआउट में जब संगतता पुस्तकालय उपयोग कर रहा है एक डमी ListFragment बनाने के लिए: फिर सहित इस टुकड़ा (अनुशंसित list_content लेआउट के बजाय) में

package com.example.app; 

import android.support.v4.app.ListFragment; 

public class ListContentFragment extends ListFragment { 
    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     //Supress default list and empty text behavior 
     //super.onViewCreated(view, savedInstanceState); 
    } 
} 

आपका कस्टम लेआउट:

... 
<fragment class="com.example.app.ListContentFragment" 
    android:layout_weight ="1" 
    android:layout_width ="fill_parent" 
    android:layout_height ="0dip" /> 
... 

इस तरह से आपको इसके लिए कस्टम लेआउट होने पर ListFragment का एक पूर्ण कार्यात्मक डिफ़ॉल्ट व्यवहार प्राप्त होगा।

2

मैं यह देखने के लिए निराश था कि list_content लेआउट समर्थन लाइब्रेरी का उपयोग करके उपलब्ध नहीं था।

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View listContent = super.onCreateView(inflater, container, 
      savedInstanceState); 

    View v = inflater.inflate(R.layout.my_custom_layout, container, 
      false); 

    FrameLayout listContainer = (FrameLayout) v.findViewById(R.id.my_list_container); 

    listContainer.addView(listContent); 

    return v; 
} 

मैं एक FrameLayout जहां ListView अपने कस्टम लेआउट में हुआ करता था कहा: मेरे दृष्टिकोण ListFragment के डिफ़ॉल्ट onCreateView विधि का पुन: उपयोग और मेरे कस्टम लेआउट के एक भाग के रूप में इसे जोड़ने के लिए बस गया था।

+1

मैंने अपरिवर्तित किया क्योंकि ऐसा लगता है कि setListShown (false) के साथ डिफ़ॉल्ट "लोडिंग/अनिश्चित प्रगति" दृश्य को बनाए रखने का यही एकमात्र तरीका होगा। दुर्भाग्य से यह समर्थन लाइब्रेरी से ListFragment को बाहर करता है, खाली सूची (@ id/android: खाली) के दृश्य के साथ संयुक्त होने पर वास्तव में उस प्रगति दृश्य का समर्थन नहीं करता है। कार्यान्वयन [यहां] (https://android.googlesource.com/platform/frameworks/support/+/master/v4/java/android/support/v4/app/ListFragment.java#335) केवल एक को खोजने का प्रयास करता है कस्टम खाली दृश्य अगर डिफ़ॉल्ट एक नहीं बनाया गया है। – tangobravo

+0

क्या हम findViewById को कॉल करने के बजाय कंटेनर का उपयोग नहीं कर सकते हैं। यही वह जगह है जहां हम एंड्रॉइड को सूची दृश्य को पहले से ही रखने के लिए कह रहे हैं। – wheredidthatnamecomefrom

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