2015-06-12 13 views
5

Próbuję uzyskać właściwość NumberPicker w klasie, która rozszerza DialogPreference, i mam wiele problemów z uruchomieniem metody setView(). Zacznijmy od jakiegoś kodu:Alertdialog.Builder setview: Call wymaga poziomu interfejsu 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); 
    } 
} 

To daje mi błąd na builder.setView mówiąc: „Zaproszenie wymaga API 21 (obecny jest 15 min).” Chcę obsługiwać urządzenia z interfejsami API 15+, więc zmiana tej opcji nie jest możliwa. Teraz, gdy próbuję zastąpić

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

Zamiast tego mówi, „Metoda nie przesłonić metodę z nadklasy.”

Pytanie brzmi, jak ustawić widok? To niekoniecznie musi być w onPrepareDialogBuilder(), o ile obsługuje API 15+. Dzięki!

PS: Daj mi znać, jeśli potrzebujesz więcej kodu. Aby dostać wyświetlane w formacie XML, wystarczy dodać to do <PreferenceScreen>:

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

Odpowiedz

18

Co starasz się zrobić tutaj to wywołać funkcję, która została dodana w API 21 zamiast dodany w API 1. Jak na the documentation, chcesz setView(View view) zamiast setView(int layoutResId). Aby uzyskać View z układu, potrzebujesz LayoutInflater. Aby uzyskać wystąpienie LayoutInflater, potrzebny będzie obiekt kontekstu. Tworząc okno dialogowe, polecam przechowywanie Twojego Context jako zmiennej w klasie do wykorzystania w przyszłości. Następnie w onPrepareDialogBuilder, można użyć (as per the docs):

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

Teraz można użyć inflater dostać View z układu i ustawić dialogowego View następująco:

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

Tak, twój kod może wyglądać następująco:

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

Mam nadzieję, że to pomoże!

+1

Ups, brakowało mi faktu, że setView (View) działał ze starszymi API. Dzięki, działa idealnie. –

+0

Wielkie dzięki! Próbuję uzyskać setView() do pracy, odkąd zmieniłem mój minimalny sdk na 15 ... ... – Zillinium

0

miałem kilka nie tak zabawne doświadczenia próbując dostosować powiadomienie dialogi, i polecam po prostu omija się ten pomysł, kiedy naprawdę trzeba mieć szczegółowe wyskakujące okienko. Oto niektóre kodu dla fragmentu dialogowym Jeśli chcesz spróbować tej drogi zamiast ...

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

Próbuję go uruchomić w Preferencjach, więc Fragment nie brzmi jak najlepsza droga. Oczywiście mogę się mylić, ale z mojego zrozumienia wynika, że ​​PreferenceDialog byłby logicznym wyborem. Rzeczywiście mam inną klasę RadiusPickerFragment, która jest bardzo podobna, z którą nie mam problemu, ponieważ przesłonił metodę onCreateDialog(), więc mogę użyć obsługi AlertDialog.Builder. Chciałbym go mieć w preferencjach, żeby ustawić domyślne. –

2

Zamiast dzwonić pod numer setView(int resourceId), który wymaga interfejsu API21 + wystarczy utworzyć obiekt View, nadmuchać zasób i wywołać setView(View view), przekazując ten widok.

Powiązane problemy