AlertDialog.Builder setView:调用要求API级别21

10

我在尝试在一个继承自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上出现了一个错误,显示“调用需要API 21(当前最小值为15)”。我想支持API 15+的设备,因此更改这个选项不是一个选择。如果我尝试覆盖 protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder builder) 它会显示“该方法未覆盖其超类的方法”。
问题是,我如何设置视图?只要支持API 15+即可,它不一定要在onPrepareDialogBuilder()中。谢谢!
PS:如果您需要更多代码,请告诉我。要在XML中显示它,请将其添加到中。
<com.example.project.RadiusPickerPreference
    android:id="@+id/radPickerPref"
    android:key="@string/pref_key_default_radius"
    android:title="@string/pref_title_default_radius"/>
3个回答

27

您在这里尝试调用一个添加在API 21中的函数,而不是API 1中添加的函数。根据文档,您需要使用setView(View view)而不是setView(int layoutResId)。要从布局获取View,您需要一个LayoutInflater实例。为了获取LayoutInflater实例,您需要一个上下文对象。当创建对话框时,建议将您的Context存储为类中的变量以供将来使用。然后,在onPrepareDialogBuilder中,您可以使用(根据文档):

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的事实。谢谢,现在完美运行。 - pat_brat
非常感谢!自从我将最小SDK更改为15以来,我一直在尝试使setView()起作用... - Empire of E

2

不要调用 setView(int resourceId) 方法,因为它需要 API21 及以上版本。相反,创建一个 View 对象,将资源文件填充到这个视图中,然后调用 setView(View view) 方法并传入该视图。


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");

嗯,我正在尝试在“首选项”中运行它,使用Fragment似乎不是最好的选择。当然,我可能错了,但据我所知,PreferenceDialog是合乎逻辑的选择。实际上,我还有另一个非常相似的RadiusPickerFragment类,我没有问题,因为它重写了onCreateDialog()方法,所以我可以使用support AlertDialog.Builder。我只想把它放在首选项中,这样我就可以设置默认值了。 - pat_brat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接