2015-06-12 2 views
5

Я пытаюсь получить радиус NumberPicker, запущенный в классе, который расширяет DialogPreference, и у меня возникли проблемы с работой setView(). Давайте начнем с некоторым кодом:Alertdialog.Builder setview: для вызова требуется уровень 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); 
    } 
} 

Это дает мне ошибку на builder.setView говоря: «Вызов требует API 21 (ток мин составляют 15).» Я хочу поддерживать устройства с API 15+, поэтому изменение этого параметра не является вариантом. Теперь, если я пытаюсь переопределить

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

вместо этого, он говорит: «Метод не отменяет метод из суперкласса.»

Вопрос в том, как я могу установить представление? Это необязательно должно быть в onPrepareDialogBuilder(), если оно поддерживает API 15+. Благодаря!

PS: Дайте мне знать, если вам нужно больше кода. Чтобы получить это отображается в 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

Что вы пытаетесь сделать здесь вызвать функцию, которая была добавлена ​​в API 21 вместо одного добавленных в API 1. Согласно the documentation, вы хотите setView(View view) вместо setView(int layoutResId). Чтобы получить 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

К сожалению, я пропустил тот факт, что setView (View) работал со старыми API-интерфейсами. Спасибо, отлично работает. –

+0

Спасибо soooo много! Я пытаюсь заставить setView() работать с тех пор, как сменил минимальный sdk на 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

Ну, я пытаюсь запустить его в настройках, поэтому фрагмент не похож на лучший способ. Конечно, я могу ошибаться, но из моего понимания предпочтение было бы предпочтительным выбором. У меня действительно есть другой класс RadiusPickerFragment, который очень похож, с которым у меня нет проблем, поскольку он переопределяет метод onCreateDialog(), поэтому я могу использовать поддержку AlertDialog.Builder. Я просто хотел бы иметь его в настройках, чтобы установить значение по умолчанию. –

2

Вместо того, чтобы звонить setView(int resourceId), для чего требуется API21 +, просто создайте объект View, запустите ресурс и позвоните по номеру setView(View view).

Смежные вопросы