我正在尝试在扩展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)
相反,它说“方法不会覆盖其超类的方法。”
问题是,我该如何设置视图?它不一定必须在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"/>
答案 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");