2011-04-01 18 views
10

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

मैं किसी प्राथमिकता के लेआउट व्यू के रूप में एक XML लेआउट का उपयोग कैसे करूं? मैं इस कस्टम वरीयता को वरीयता सक्रियता में कैसे जोड़ूं जैसे कि टैप किए जाने पर लॉन्च किया गया?

आप

* जवाब में संपादित करें Alibi के

मैं, एक प्राथमिकता स्क्रीन से एक गतिविधि शुरू करने के लिए कोशिश कर रहा हूँ एक्सएमएल में शुरू होने की गतिविधि की घोषणा के द्वारा धन्यवाद। यह इस अपवाद का कारण बनता है:

04-01 19:04:37.962: ERROR/AndroidRuntime(8061): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.me/CustomPrefScreen}; have you declared this activity in your AndroidManifest.xml? 

* एक और अद्यतन। हालांकि, अगर मैं वरीयताओं के कुछ विस्तार के साथ सेटिंग्स.एक्सएमएल में प्रीफ्रेंसस्क्रीन को प्रतिस्थापित करता हूं, जो कस्टमप्रफस्क्रीन लॉन्च करने के लिए ऑनक्लिक() पर ओवरराइड करता है, तो सबकुछ ठीक काम करता है।

मुख्य वरीयताओं गतिविधि:

public class MyPreferences extends PreferenceActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.settings); 
    } 
} 

settings.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceScreen 
     android:summary="my summary" 
     android:title="my title"> 
     <intent android:action="android.intent.action.MAIN" 
        android:targetPackage="com.me" 
        android:targetClass="CustomPrefScreen"/> 
    </PreferenceScreen> 

</PreferenceScreen> 

mainfest फ़ाइल

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.me" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <application 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.NoBackground"> 
     <activity 
      android:name=".MyApp" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      </activity> 
     <activity 
      android:name=".CustomPrefScreen" 
      android:label="@string/app_name"> 
     </activity> 
     <activity 
      android:name=".MyPreferences" 
      android:label="@string/app_name"> 
     </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="4" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
</manifest> 
+1

दोनों बातें अच्छी तरह से एपीआई प्रदर्शन उदाहरण में समझाया गया है। मजेदार बात यह है कि यह एसडीके निर्देशिका में है, इस प्रकार आपके पास अभी आपके हार्ड ड्राइव में उदाहरण हैं। – Cristian

+0

क्या आपको दूसरी प्राथमिकता के लिए अन्य प्राथमिकताओं की आवश्यकता है? यदि आप बस एक से अधिक स्क्रीन चाहते हैं तो शायद वरीयता स्क्रीन का उपयोग कर? – slund

+0

@ स्लंड। मैं एक वरीयता स्क्रीन का उपयोग करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि इसके लिए कस्टम एक्सएमएल लेआउट का उपयोग कैसे करें; ऐसा लगता है कि इसमें केवल वरीयता प्रकार के विचार जोड़े जा सकते हैं? – ab11

उत्तर

18

एक समाधान एक DialogPreference जो एक कस्टम लेआउट की स्थापना की अनुमति देता है विस्तार करने के लिए किया जाएगा वरीयता संवाद के लिए। इस तरह आपके पास वरीयता सूचीबद्ध है और जब आप इसे टैप करते हैं, तो आपको अपनी कस्टम सेटिंग्स UI के साथ एक संवाद मिलता है।

<com.xyz.MyPreference 
      android:dialogLayout="@layout/yourlayout" 
      android:dialogTitle="Dialog Title" 
      android:dialogMessage="Dialog summary" 
      android:key="preference_key" 
      android:title="Preference Title" 
      android:summary="Preference summary" 
      android:defaultValue="Default Value" /> 

और वर्ग

class MyPreference extends DialogPreference { 
// along with constructors, you will want to override 
    @Override 
    protected void onBindDialogView(View view) { 
     super.onBindDialogView(view); 
     // view is your layout expanded and added to the dialog 
      // find and hang on to your views here, add click listeners etc 
      // basically things you would do in onCreate 
     mTextView = (TextView)view.findViewById(R.Id.mytextview); 
     } 

     @Override 
     protected void onDialogClosed(boolean positiveResult) { 
      super.onDialogClosed(positiveResult); 

      if (positiveResult) { 
       // deal with persisting your values here 
      } 
     } 
} 

जाहिर है वहाँ कुछ अन्य विवरण हैं, लेकिन यह मूल विचार है।

+0

मैंने इसे माना, लेकिन वास्तव में DialogPreference को विस्तारित नहीं करना चाहते हैं। मैं "ठीक" और "रद्द" बटन नहीं चाहता, न ही संवाद शैली। मैं कस्टम वरीयता चाहता हूं कि वरीयता एक्टिविटी जिसने इसे लॉन्च किया था। – ab11

+0

वैसे आप वरीयता के साथ ऐसा कर सकते हैं और एंड्रॉइड सेट कर सकते हैं: प्राथमिकता के लिए लेआउट आपके एक्सएमएल लेआउट होने के लिए। इस तरह आपका लेआउट वरीयता स्क्रीन में दिखाता है। आप एंड्रॉइड के साथ विजेट भाग को ओवरराइड भी कर सकते हैं: widgetLayout। फिर आप श्रोताओं को अपने नियंत्रण में संलग्न करने के लिए बाइंडव्यू पर सुनते हैं। – slund

+0

मुश्किल नहीं है, लेकिन .. अगर मैं अपनी मुख्य वरीयता सक्रियता में वरीयता स्क्रीन जोड़ता हूं, और फिर मैंने उस वरीयता स्क्रीन का लेआउट सेट किया है, तो कस्टम लेआउट मुख्य वरीयता एक्टिविटी के भीतर दिखाता है, और वरीयता स्क्रीन शीर्षक और सारांश नहीं दिखाता है। प्राथमिकता को टैप करने पर, मैं शीर्षक और सारांश को दिखाने के लिए, और कस्टम विंडो को एक नई विंडो में दिखाने के लिए पसंद करूंगा। – ab11

0

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

<PreferenceScreen android:summary="@string/pref_summary" android:title="@string/title_summary"> 
    <intent android:action="android.intent.action.MAIN" 
    android:targetPackage="targetPackage" 
    android:targetClass="targetClass"/> 
</PreferenceScreen> 

मेनिफेस्ट में अपनी गतिविधि को पंजीकृत न करें!

+0

धन्यवाद, यह समझ में आता है। हालांकि, यह निम्नलिखित अपवाद के साथ विफल रहता है, भले ही मैं पूरी तरह से निश्चित हूं कि मैंने अपने मैनिफेस्ट में गतिविधि पंजीकृत की है। कोई विचार क्यों? "android.content.ActivityNotFoundException: स्पष्ट गतिविधि वर्ग {com.me.CustomPreference} को खोजने में असमर्थ; क्या आपने यह गतिविधि अपने AndroidManifest.xml में घोषित की है?" – ab11

+0

क्या आप मेनिफेस्ट पोस्ट कर सकते हैं? – alibi

+0

मैंने इसे अपनी मूल पोस्ट में एक संपादन के रूप में जोड़ा। – ab11

5

आप गैलरी या कैमरे से एक फोटो अपलोड करने के लिए मैंने जो कुछ किया है उसके समान कुछ करना चाहूंगा।

package com.atClass.lmt; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.preference.PreferenceActivity; 
import android.preference.Preference; 
import android.preference.Preference.OnPreferenceClickListener; 
import android.provider.MediaStore; 
import android.util.Log; 


public class Prefs extends PreferenceActivity{ 
    //public static final int FLAG_ACTIVITY_CLEAR_TOP = 1; 
    private static final int MEDIA_IMAGE_REQUEST_CODE = 1; 
    private static final int CAMERA_IMAGE_REQUEST_CODE = 2; 
    public static Uri cImageUri; 

    public static Context cContext; 
    public static Activity cActivity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.settings); 

     this.cContext = (Context)this; 
     this.cActivity = (Activity)this; 

     Preference customPref = (Preference) findPreference("user_display_picture"); 
     customPref.setOnPreferenceClickListener(
       new OnPreferenceClickListener() { 
        public boolean onPreferenceClick(Preference preference) { 
         return imageUploadDialog(); 
        } 
       }); 
    } 

    protected void onStop(){ 
     super.onStop(); 
     MapTools.createMapView(false); 
     Lmt.serviceBinder.serviceThread("loginDevice"); 
    } 

    public boolean imageUploadDialog(){ 
     final CharSequence[] items = {"Take picture now","Upload from gallery"}; 
     AlertDialog.Builder lAlertDialog = new AlertDialog.Builder(cContext); 
     lAlertDialog.setTitle("Upload action"); 
     lAlertDialog.setCancelable(true); 
     lAlertDialog.setItems(items, 
       new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialogInterface, int i){ 
       //Toast.makeText(getApplicationContext(), "Selected item: " +i, Toast.LENGTH_SHORT).show(); 
       if (i == 0){ 
        attachCameraImage(); 
       } 
       if (i == 1){ 
        attachGalleryImage(); 
       } 
      } 
     }); 
     lAlertDialog.setIcon(R.drawable.click_to_url); 
     lAlertDialog.show(); 
     return true; 
    } 

    public void attachGalleryImage(){ 
     Intent getImageFromGalleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
     startActivityForResult(getImageFromGalleryIntent, MEDIA_IMAGE_REQUEST_CODE); 
    } 

    public void attachCameraImage(){ 
     String fileName = "testphoto.jpg"; 
     ContentValues values = new ContentValues(); 
     values.put(MediaStore.Images.Media.TITLE, fileName); 
     values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera"); 
     values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 
     cImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, cImageUri); 
     intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
     startActivityForResult(intent, CAMERA_IMAGE_REQUEST_CODE); 
    } 

    protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) { 
     Log.d(Global.TAG,"--> Received callback with:" + resultCode); 
     super.onActivityResult(requestCode, resultCode, i); 
     if(resultCode == RESULT_OK) { 
      Log.d(Global.TAG,"--> Result OK with:" + requestCode); 
      switch(requestCode) { 
      case MEDIA_IMAGE_REQUEST_CODE: 
       Log.d(Global.TAG,"--> MEDIA_IMAGE_REQUEST_CODE"); 
       Gui.GuiProgressDialog.showLoadingSpinner(cActivity); 
       cImageUri = i.getData(); 
       if (cImageUri == null){Log.d(Global.TAG,"--> ImageURI is null!");} 
       Lmt.serviceBinder.serviceThread("uploadMemberPicture"); 
       break; 
      case CAMERA_IMAGE_REQUEST_CODE: 
       Log.d(Global.TAG,"--> CAMERA_IMAGE_REQUEST_CODE"); 
       //cImageUri = i.getData(); 
       if (cImageUri == null){Log.d(Global.TAG,"--> ImageURI is null!");} 
       Lmt.serviceBinder.serviceThread("uploadMemberPicture"); 
       break; 
      } 
     } 
    } 
} 
7

बहाना समाधान - एक <PreferenceScreen> प्रविष्टि के भीतर एक इरादे को परिभाषित करने की - मेरे लिए काम किया, targetPackage और targetClass क्षेत्रों में ज्यादा परीक्षण और त्रुटि के बाद।

targetPackage को मेरे एप्लिकेशन के पैकेज नाम (यानी, package= एंड्रॉइडManifest.xml फ़ाइल में प्रविष्टि का पूरा पथ होना आवश्यक है)। targetClass को गतिविधि के लिए पूरा मार्ग होना चाहिए - पैकेज नाम सहित, भले ही गतिविधि एप्लिकेशन के समान पैकेज में हो।

एप्लिकेशन के लिए AndroidManifest.xml फ़ाइल भी (निश्चित रूप से) गतिविधि के लिए एक प्रविष्टि की आवश्यकता है।मैंने इस प्रविष्टि के लिए <intent-filter> परिभाषित नहीं किया है, संभवतः actionMAIN है (यह सच था कि गतिविधि एक ही या एप्लिकेशन की तुलना में एक अलग पैकेज थी)।

उदाहरण: एप्लिकेशन का पैकेज com.thissocialworld है। गतिविधि जिसे मैं PreferencesScreen से लात मारना चाहता हूं com.coolcommon नामक पैकेज में है और गतिविधि वर्ग com.thissocialworld.SpecialPreferences है। <PreferenceScreen> भीतर प्रवेश इस तरह दिखता है:

<intent android:action="android.intent.action.MAIN" 
android:targetPackage="com.thissocialworld" 
android:targetClass="com.thissocialworld.SpecialPreferences"/> 

मैं अगर यह PreferencesManager तक पहुँच प्राप्त करने के लिए आवश्यक प्रतीत हो रहा है action.PREFERENCES को action.MAIN बदलने का प्रयास कर सकते हैं।

(पी एस मेरा पहला यहाँ पोस्ट, मैं कैसे चर्चा बहाना द्वारा शुरू करने के लिए एक टिप्पणी के रूप में इस पोस्ट करने के लिए समझ नहीं सकता है।)

+0

अच्छी नौकरी, धन्यवाद! –

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