防止 DialogFragment 将应用程序发送到节能模式
Prevent DialogFragment from sending the app into energy save mode
我正在为 Android 可穿戴设备创建一个应用程序。
将自定义布局显示为对话片段时,应用程序将在大约 30 秒后最小化(被表盘取代)。我知道这应该是应用程序与用户脱节的默认行为,但就我而言,应用程序需要保持可见,即使四分钟没有被触摸。
调用它的 Activity 确实在其 onCreate
实现中获得了这些指令。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
这就像一个魅力,以我想要的方式工作。但是,用作错误通知的 DialogFragment(可能需要在一段时间内不接触它才能被观察到)不遵守此设置。
我也试图通过将其放置在 onViewCreated
调用中来获取 DialogFragment
中的标志,但它没有 getWindow
方法。虽然下一个代码段有效,但它也不起作用。
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
对话片段的调用方式如下所示。这是从需要显示它的 FragmentActivity 中调用它的代码。您可能会注意到,有一个字段 "activity",这是因为整个调用是从 activity 之外的静态 class 完成的。我想从多个活动中调用同一个 DialogFragment,只是文本和标题不同。
public static void showDialogCuston(String title, String message, FragmentActivity activity){
ErrorDialogFragment edf = ErrorDialogFragment.newInstance(title,message);
FragmentManager fm = activity.getSupportFragmentManager();
edf.show(fm, "TAG");
}
这就是 DialogFragment 内部的样子。我踢掉了所有 TextView
文本分配,因为我怀疑它们能否提供有关该请求的任何类型的信息,并且只会降低代码片段的可读性。
public class ErrorDialogFragment extends DialogFragment {
//some private text views
public ErrorDialogFragment(){
}
public static ErrorDialogFragment newInstance(String title, String text){
ErrorDialogFragment edf = new ErrorDialogFragment();
Bundle args = new Bundle();
args.putString("title",title);
args.putString("text",text);
edf.setArguments(args);
return edf;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_error, container, false);
// R.layout.fragment_error is the layout that serves as my custom dialog
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//assigning layout elements to private fields
//assigning stuff from the bundle inside some textViews
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
//playing a sound from SoundPool and doing haptic feedback on button press
}
});
}
}
所以,我想要的是,当一个人盯着 DialogFragment
太久而没有触摸它时,应用程序不会自行消失。
对于您的情况,我建议在对话框布局文件中保留屏幕打开标志,以便在对话框视图可见时,它会保持屏幕打开。查看 developer's documentation 了解更多信息。但是,为了方便起见,我添加了文档中的代码。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
...
</RelativeLayout>
在对话框布局的根元素中将 android:keepScreenOn
设置为 true
。我希望您的 AndroidManifest.xml
文件中也有以下权限。
<uses-permission android:name="android.permission.WAKE_LOCK" />
我正在为 Android 可穿戴设备创建一个应用程序。
将自定义布局显示为对话片段时,应用程序将在大约 30 秒后最小化(被表盘取代)。我知道这应该是应用程序与用户脱节的默认行为,但就我而言,应用程序需要保持可见,即使四分钟没有被触摸。
调用它的 Activity 确实在其 onCreate
实现中获得了这些指令。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
这就像一个魅力,以我想要的方式工作。但是,用作错误通知的 DialogFragment(可能需要在一段时间内不接触它才能被观察到)不遵守此设置。
我也试图通过将其放置在 onViewCreated
调用中来获取 DialogFragment
中的标志,但它没有 getWindow
方法。虽然下一个代码段有效,但它也不起作用。
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
对话片段的调用方式如下所示。这是从需要显示它的 FragmentActivity 中调用它的代码。您可能会注意到,有一个字段 "activity",这是因为整个调用是从 activity 之外的静态 class 完成的。我想从多个活动中调用同一个 DialogFragment,只是文本和标题不同。
public static void showDialogCuston(String title, String message, FragmentActivity activity){
ErrorDialogFragment edf = ErrorDialogFragment.newInstance(title,message);
FragmentManager fm = activity.getSupportFragmentManager();
edf.show(fm, "TAG");
}
这就是 DialogFragment 内部的样子。我踢掉了所有 TextView
文本分配,因为我怀疑它们能否提供有关该请求的任何类型的信息,并且只会降低代码片段的可读性。
public class ErrorDialogFragment extends DialogFragment {
//some private text views
public ErrorDialogFragment(){
}
public static ErrorDialogFragment newInstance(String title, String text){
ErrorDialogFragment edf = new ErrorDialogFragment();
Bundle args = new Bundle();
args.putString("title",title);
args.putString("text",text);
edf.setArguments(args);
return edf;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_error, container, false);
// R.layout.fragment_error is the layout that serves as my custom dialog
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//assigning layout elements to private fields
//assigning stuff from the bundle inside some textViews
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
//playing a sound from SoundPool and doing haptic feedback on button press
}
});
}
}
所以,我想要的是,当一个人盯着 DialogFragment
太久而没有触摸它时,应用程序不会自行消失。
对于您的情况,我建议在对话框布局文件中保留屏幕打开标志,以便在对话框视图可见时,它会保持屏幕打开。查看 developer's documentation 了解更多信息。但是,为了方便起见,我添加了文档中的代码。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
...
</RelativeLayout>
在对话框布局的根元素中将 android:keepScreenOn
设置为 true
。我希望您的 AndroidManifest.xml
文件中也有以下权限。
<uses-permission android:name="android.permission.WAKE_LOCK" />