2015-06-12 16 views
5

Sto cercando di ottenere un raggio NumberPicker in esecuzione in una classe che estende DialogPreference e sto avendo un sacco di problemi nel far funzionare setView(). Cominciamo con un po 'di codice:Alertdialog.Builder setview: la chiamata richiede il livello API 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); 
    } 
} 

Questo mi dà un errore sul builder.setView dicendo "Call richiede API 21 (corrente minimo è 15)." Voglio supportare i dispositivi con API 15+, quindi non è possibile cambiarlo. Ora, se cerco di ignorare

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

invece, si dice "Metodo non sovrascrive il metodo della sua superclasse."

La domanda è, come posso impostare la vista? Non deve necessariamente essere in onPrepareDialogBuilder(), a patto che supporti l'API 15+. Grazie!

PS: fammi sapere se hai bisogno di più codice. Per ottenerlo visualizzata in XML, è sufficiente aggiungere ad un <PreferenceScreen>:

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

risposta

18

cosa si sta cercando di fare qui è chiamare una funzione che è stata aggiunta nel API 21 al posto di quello aggiunto in API 1. Come da the documentation, si desidera setView(View view) anziché setView(int layoutResId). Per ottenere un View da un layout, è necessario un LayoutInflater. Per ottenere un'istanza di LayoutInflater, è necessario un oggetto di contesto. Quando crei la tua finestra di dialogo, ti consiglio di memorizzare il tuo Context come variabile nella classe per uso futuro. Poi, in onPrepareDialogBuilder, è possibile utilizzare (as per the docs):

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

Ora, è possibile utilizzare inflater per ottenere un View dal layout e impostare del View vostra finestra come segue:

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

Così, il vostro potrebbe avere il seguente codice:

@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); 
} 

Speriamo che questo aiuti!

+1

Oops, ho perso il fatto che setView (View) ha funzionato con le API precedenti. Grazie, funziona perfettamente. –

+0

Grazie mille! Ho cercato di far funzionare setView() da quando ho cambiato il mio sdk minimo a 15 ... ... – Zillinium

0

Ho avuto alcune esperienze non così divertente cercando di personalizzare le finestre di dialogo di avviso, e lo consiglio solo bypassando l'idea quando si ha realmente bisogno di avere una pop-up dettagliato. Ecco alcuni codice per un frammento di dialogo se si desidera provare questa strada invece ...

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

Bene, sto cercando di farlo funzionare nelle Preferenze, quindi un frammento non sembra il modo migliore per andare. Certo, potrei sbagliarmi, ma dalla mia comprensione, un PreferenceDialog sarebbe la scelta logica. In realtà ho un'altra classe RadiusPickerFragment che è molto simile, con cui non ho alcun problema, poiché sovrascrive il metodo onCreateDialog(), quindi posso usare il supporto AlertDialog.Builder. Vorrei solo averlo nelle preferenze in modo da poter impostare un valore predefinito. –

2

Invece di chiamare setView(int resourceId), che richiede API21 + basta creare un oggetto View, gonfiare la risorsa e chiamare setView(View view) passando questa vista.

Problemi correlati