मैं 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)
आप क्या करने की कोशिश कर रहे हैं? आपको कस्टम लेआउट की आवश्यकता क्यों है? – alexanderblom
मैं वरीयता गतिविधि पर अधिक सटीक नियंत्रण रखना चाहता हूं। इसके अलावा, मैं इसे जितना संभव हो सके एंड्रॉइड एसडीके के नए संस्करणों के साथ संगत होना चाहता हूं, मुझे प्राथमिकता बढ़ाने की आवश्यकता है, लेकिन इसे खुद को खरोंच से लागू नहीं करना है। – morphium