9

我试图让一个半径 NumberPicker 在扩展 DialogPreference 的类中运行,并且我在让 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)

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

问题是,如何设置视图?它不一定必须在 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"/>
4

3 回答 3

26

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

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

现在,您可以使用从布局inflater中获取 aView并将对话框设置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);
}

希望这会有所帮助!

于 2015-06-12T13:48:44.240 回答
2

而不是调用setView(int resourceId),这需要 API21+ 只是创建一个View对象,膨胀资源并调用setView(View view)传递这个视图。

于 2015-06-12T13:51:40.220 回答
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");
于 2015-06-12T13:48:24.403 回答