2015-06-12 18 views
5

की आवश्यकता है मैं एक कक्षा में चलने वाला त्रिज्या संख्यापिकर प्राप्त करने की कोशिश कर रहा हूं जो डायलॉग प्रेफरेंस को बढ़ाता है, और मुझे काम करने के लिए setView() प्राप्त करने में बहुत परेशानी हो रही है। चलो कुछ कोड के साथ शुरू करते हैं:Alertdialog.builder setview: कॉल को एपीआई स्तर 21

public class RadiusPickerPreference extends DialogPreference{ 
    public RadiusPickerPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    @Override 
    protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder builder) { 
     builder.setTitle(R.string.set_radius_dialog_fragment_title); 
     builder.setView(R.layout.dialog_radius_picker); 
     builder.setPositiveButton(android.R.string.ok, null); 
     builder.setNegativeButton(android.R.string.cancel, null); 
    } 
} 

यह मैं builder.setView कह पर एक त्रुटि देता है "कॉल की आवश्यकता है एपीआई 21 (वर्तमान मिनट 15 है)।" मैं एपीआई 15+ के साथ डिवाइस का समर्थन करना चाहता हूं, इसलिए इसे बदलना एक विकल्प नहीं है। अब, अगर मैं

protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder builder)

बजाय

ओवरराइड करने के लिए प्रयास करते हैं, यह कहते हैं, "विधि अपने सुपर क्लास से विधि हावी नहीं होता।"

प्रश्न यह है कि, मैं दृश्य कैसे सेट कर सकता हूं? जब तक यह एपीआई 15+ का समर्थन नहीं करता है, तब तक इसे PrepareDialogBuilder() पर जरूरी नहीं है। धन्यवाद!

पीएस: अगर आपको और कोड चाहिए तो मुझे बताएं। यह XML में दिखाया गया है प्राप्त करने के लिए, बस एक <PreferenceScreen> से जोड़ें:

<com.example.project.RadiusPickerPreference 
    android:id="@+id/radPickerPref" 
    android:key="@string/pref_key_default_radius" 
    android:title="@string/pref_title_default_radius"/> 

उत्तर

18

क्या तुम यहाँ क्या करने की कोशिश कर रहे एक समारोह है कि जोड़ा एक के बजाय एपीआई 21 में जोड़ा गया फोन है एपीआई में 1. the documentation के अनुसार, आप setView(int layoutResId) के बजाय setView(View view) चाहते हैं। लेआउट से View प्राप्त करने के लिए, आपको LayoutInflater की आवश्यकता है। LayoutInflater का उदाहरण प्राप्त करने के लिए, आपको एक संदर्भ वस्तु की आवश्यकता होगी। जब आप अपना संवाद बनाते हैं, तो मैं भविष्य में उपयोग के लिए कक्षा में एक चर के रूप में अपने Context को संग्रहीत करने की अनुशंसा करता हूं। फिर, onPrepareDialogBuilder में, आप (as per the docs) का उपयोग कर सकते हैं: अब

LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE) 

, आप inflater का उपयोग अपने लेआउट से एक View प्राप्त करने के लिए कर सकते हैं और सेट अपने संवाद के View इस प्रकार है:

View v = inflater.inflate(R.layout.dialog_radius_picker, null); 

तो, अपने कोड इस तरह दिख सकता है:

@Override 
protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder builder) { 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 
    builder.setTitle(R.string.set_radius_dialog_fragment_title); 
    View v = inflater.inflate(R.layout.dialog_radius_picker, null); 
    builder.setView(v); 
    builder.setPositiveButton(android.R.string.ok, null); 
    builder.setNegativeButton(android.R.string.cancel, null); 
} 

उम्मीद है कि मदद करता है!

+1

ओह, मुझे इस तथ्य को याद आया कि सेटव्यू (व्यू) ने पुराने एपीआई के साथ काम किया था। धन्यवाद, पूरी तरह से काम करता है। –

+0

बहुत बहुत धन्यवाद! मैं setView() को तब तक काम करने की कोशिश कर रहा हूं जब से मैंने अपना न्यूनतम एसडीके 15 में बदल दिया ... ... – Zillinium

0

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

public class AboutUs extends DialogFragment { 



public interface DialogListener { 
    void onDialogFinish(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_about_us, container, 
      false); 
    getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 

    Display display = getActivity().getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); display.getSize(size); 
    int width=size.x; int height=size.y; //change these to make your dialog the size you wish 

    WindowManager.LayoutParams wmlp = getDialog().getWindow().getAttributes(); 
    wmlp.height=height; wmlp.width=width; 

    getDialog().getWindow().setAttributes(wmlp); 
    WindowManager.LayoutParams lp = getDialog().getWindow().getAttributes(); 
    lp.dimAmount=0.4f; 
    getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
    getDialog().setCanceledOnTouchOutside(true); 



    return rootView; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(DialogFragment.STYLE_NO_FRAME, android.support.v7.appcompat.R.style.Theme_AppCompat_Light); 

} 


public AboutUs() 
{ 
} 


} 




\\to call fragment from activity 

AboutUs aboutUs = new AboutUs(); 
aboutUs.show(getSupportFragmentManager(), "Dialog Fragment"); 
+0

ठीक है, मैं इसे प्राथमिकता में चलाने की कोशिश कर रहा हूं, इसलिए एक टुकड़ा जाने का सबसे अच्छा तरीका नहीं लगता है। बेशक, मैं गलत हो सकता हूं, लेकिन मेरी समझ से, एक वरीयताDialog तार्किक पसंद होगा। मेरे पास वास्तव में एक और त्रिज्या पिकरफ्रैगमेंट क्लास है जो बहुत समान है, जिसके साथ मुझे कोई समस्या नहीं है, क्योंकि यह ऑनक्रेट डायलॉग() विधि को ओवरराइड करता है, इसलिए मैं समर्थन AlertDialog.Builder का उपयोग कर सकता हूं। मैं इसे वरीयताओं में रखना चाहूंगा ताकि मैं एक डिफ़ॉल्ट सेट कर सकूं। –

2

setView(int resourceId) पर कॉल करने के बजाय, जिसके लिए API21 + की आवश्यकता है, बस View ऑब्जेक्ट बनाएं, संसाधन को बढ़ाएं और इस दृश्य को पास करने वाले setView(View view) पर कॉल करें।

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