Alertdialog.Builder setview:调用需要API级别21

时间:2015-06-12 13:37:04

标签: java android alertdialog dialog-preference

我正在尝试在扩展DialogPreference的类中运行一个半径NumberPicker,并且我在使setView()工作时遇到了很多麻烦。让我们从一些代码开始:

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的错误,说“Call需要API 21(当前min为15)”。我想支持API 15+的设备,因此更改此选项不是一种选择。现在,如果我试图覆盖

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

相反,它说“方法不会覆盖其超类的方法。”

问题是,我该如何设置视图?它不一定必须在onPrepareDialogBu​​ilder()中,只要它支持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"/>

3 个答案:

答案 0 :(得分:23)

您在此尝试执行的操作是调用API 21中添加的功能,而不是API 1中添加的功能。根据the documentation,您需要setView(View view)而不是setView(int layoutResId) {1}}。要从布局中获取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 :(得分:2)

而不是调用需要API21 +的setView(int resourceId)只需创建一个View对象,而是通过此视图对资源进行充气并调用setView(View view)

答案 2 :(得分: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");