2011-10-21 13 views
16

मैं minSdkVersion = "11" के साथ ऐप विकसित कर रहा हूं, यह टैबलेट और एंड्रॉइड 4.0 और नए के लिए ऐप है। मैंने इस विषय पर इंटरनेट की जांच की है, लेकिन मुझे बहुत कुछ नहीं मिला है।एंड्रॉइड - एंड्रॉइड 3.0 में वरीयता एक्टिविटी के लिए कस्टम लेआउट कैसे सेट करें?

एंड्रॉइड एसडीके के पिछले संस्करणों के लिए कस्टम लेआउट को लागू करने के लिए हमें केवल सूची दृश्य के साथ लेआउट (preference.xml कहें) बनाना है और इसकी आईडी android.R.id.list के बराबर है और setContentView विधि का उपयोग करें।

preference.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <ListView android:id="@android:id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" /> 
</RelativeLayout> 

एंड्रॉयड में 3.0 चीजें बदल गई और प्राथमिकताएं टुकड़े के उपयोग के साथ लागू किया जाता है। यही कारण है कि कैसे मेरे preference_headers.xml फ़ाइल की तरह लग रहा है:

<preference-headers 
     xmlns:android="http://schemas.android.com/apk/res/android"> 

    <header android:fragment="com.example.MyPreferenceActivity$GeneralSettingsFragment" 
      android:title="General" 
      android:summary="Common settings." /> 
    <header 
      android:title="Example.com" > 
     <intent android:action="android.intent.action.VIEW" 
       android:data="http://www.example.com" /> 
    </header> 

</preference-headers> 

MyPreferenceActivity.java:

public class MyPreferenceActivity extends PreferenceActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.preference); 
     // Add a button to the header list. 
     if (hasHeaders()) { 
      Button button = new Button(this); 
      button.setText("Log out"); 
      setListFooter(button); 

     } 

    } 


    /** 
    * Populate the activity with the top-level headers. 
    */ 
    @Override 
    public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.preference_headers, target); 
    } 

    public static class GeneralSettingsFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.fragmented_preferences); 

     } 
    } 
} 

अब अगर मैं MyPreferenceActivity चलाने मैं LogCat में यह त्रुटि दिखाई देगा:

> java.lang.IllegalArgumentException: No view found for id 0x10202be for 
> fragment GeneralSettingsFragment{4077f8c0 #0 id=0x10202be} 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:729) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:909) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1584) 
> E/AndroidRuntime(17103): at 
> android.app.Activity.performStart(Activity.java:4377) 
> E/AndroidRuntime(17103): at 
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1724) 
> E/AndroidRuntime(17103): ... 11 more 

मैं पता है कि इस समस्या का कारण क्या है। FragmentManager में केवल सामान्य SettingsFragment खंड को सम्मिलित करने के लिए कोई दृश्य नहीं मिल रहा है। लेकिन मुझे नहीं पता कि इसे कैसे हल किया जाए।

वैसे, अगर मैं एंड्रॉइड 4.0 पर एक ही ऐप चलाता हूं, तो मैं हेडर के साथ पहली वरीयता गतिविधि देख सकता हूं। लेकिन अगर मैं सामान्य पर क्लिक करता हूं, तो ऐप क्रैश हो जाएगा और मुझे लॉगकैट में समान त्रुटि मिल जाएगी:

java.lang.IllegalArgumentException: No view found for id 0x10202cd for fragment GeneralSettingsFragment{4134b4e0 #0 id=0x10202cd} 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:789) 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998) 
E/AndroidRuntime(2170):  at android.app.BackStackRecord.run(BackStackRecord.java:622) 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330) 
E/AndroidRuntime(2170):  at android.app.Activity.performStart(Activity.java:4474) 
E/AndroidRuntime(2170):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928) 
+0

आप क्या करने की कोशिश कर रहे हैं? आपको कस्टम लेआउट की आवश्यकता क्यों है? – alexanderblom

+0

मैं वरीयता गतिविधि पर अधिक सटीक नियंत्रण रखना चाहता हूं। इसके अलावा, मैं इसे जितना संभव हो सके एंड्रॉइड एसडीके के नए संस्करणों के साथ संगत होना चाहता हूं, मुझे प्राथमिकता बढ़ाने की आवश्यकता है, लेकिन इसे खुद को खरोंच से लागू नहीं करना है। – morphium

उत्तर

-1

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

+0

मुझे पता है कि मुझे इसकी आवश्यकता नहीं है। लेकिन इस उदाहरण में मैंने सूची फूटर में बटन जोड़ा। अब मैं दृश्य को अधिक सटीक रूप से अनुकूलित करना चाहता हूं। शायद गतिविधि के शीर्ष में लोगो जोड़कर, आदि, मुझे इसकी ज़रूरत है। मैं समझ में नहीं आता, प्री-एंड्रॉइड 3.0 ऐप्स के लिए वरीयता एक्टिविटी के अनुकूलन के बारे में कई उदाहरण और ट्यूटोरियल हैं। क्या यह 10 से अधिक एपीआई एसडीके के लिए काम करना असंभव है? – morphium

2

मैं अपने आवेदन

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory android:title="@string/PreferencesActivity.GeneralSettingsCategoryTitle"> 
     <Preference 
      android:title="yor title" 
      android:summary="your summary" 
      android:key="key to access preference" />  
     <Preference 
      android:title="@string/" 
      android:summary="@string/" 
      android:key="key2" /> 
     <PreferenceScreen 
      android:key="key3" 
      android:title="@string/" 
      android:summary="@string/"> 
      <CheckBoxPreference 
       android:title="@string/" 
       android:defaultValue="false" 
       android:summary="@string/" 
       android:key="key4" /> 
      <CheckBoxPreference 
       android:title="@string/" 
       android:defaultValue="true" 
       android:summary="@string/" 
       android:key="key5" /> 

      <ListPreference 
       android:title="@string/" 
       android:summary="@string/" 
       android:key="key6" 
       android:defaultValue="buttons" 
       android:entries="@array/" 
       android:entryValues="@array/" /> 
      .... 


       </prefefenceScreen> 
     </preferenceCategory> 
</preferenceScreen> 



enter code here 
5

के लिए इस कोड की कोशिश की मैं आप से एक ही मुद्दा था।

मैं सामान का एक बहुत कोशिश की, लेकिन यहाँ मेरा पूरा कोड है:

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/MyPreferenceActivity.java

चाल onBuildHeaders खंड में setContentView जोड़ने के लिए है, लेकिन नहीं onCreate में।

मैंने खंड में कुछ परीक्षण भी किए और पूरी तरह से यह सुनिश्चित नहीं किया कि यह क्यों काम कर रहा है, लेकिन मैं आपको वादा करता हूं: मेरे पास टैबलेट हेडर सेक्शन पर एक कस्टम लेआउट है!

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/view/StockPreferenceFragment.java

+5

लिंक टूटे हुए हैं – Dave

+0

लिंक टूटा हुआ है, लेकिन मैं इसे ढूंढने में सक्षम था: https://github.com/iRail/BeTrains-for-Android/blob/master/BeTrains/src/main/java/tof/cv/ mpp/MyPreferenceActivity.java – Glaucus

+0

हालांकि, मुझे BildHeaders परContentView को सेट करने के लिए कोई कॉल नहीं दिखाई दे रहा था। तो सुनिश्चित नहीं है कि क्या सोचना है। – Glaucus

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