在我的java应用程序中,我有这个代码
@Override
public void onAttachedToWindow()
{
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
super.onAttachedToWindow();
}
Run Code Online (Sandbox Code Playgroud)
当我为Android 2.3(10级)构建它时, 它编译并正常工作.但是,当我为Android 4.0(15级)构建它时,它编译并在运行时和崩溃后让我崩溃
07-16 14:00:03.090: E/AndroidRuntime(29487): FATAL EXCEPTION: main
07-16 14:00:03.090: E/AndroidRuntime(29487): java.lang.IllegalArgumentException: Window type can not be changed after the window is added.
Run Code Online (Sandbox Code Playgroud)
当我评论这一行,并建立它工作正常,没有问题..
//this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
Run Code Online (Sandbox Code Playgroud)
所以我不明白为什么这个代码意味着什么?
编辑: 这里有一些参考
我有以下问题:
我想创建一个工具栏,通过向窗口管理器添加视图来设置设备(TV)的常规设置.我的工具栏在屏幕底部可见,它是当前所选应用程序的叠加层.它有以下参数/标志:
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
- WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-PixelFormat.TRANSLUCENT当我点击工具栏时它工作正常.当我点击背景时,工具栏仍处于前台,后台应用程序正常工作.
当我ListView从工具栏填充时,问题就开始了.有了这些参数,onClick和onSelectItem听众不工作对ListView.当我删除时FLAG_NOT_FOCUSABLE,听众开始工作,但我不能再使用后台应用程序了.我必须关闭我的工具栏才能专注于背景.
您是否有任何想法,如何使两者ListView和后台应用程序响应?
提前谢谢,每个答案/
所以昨天我正在编程,突然我setTitle在WindowManager.LayoutParams课堂上遇到了这个方法,为什么这个类有这样的setTitle方法呢?在哪里使用?该文档没有说明该功能.
我的猜测是,它可以用于调试或类似的东西,但除此之外,我没有线索.
为什么它会被宣布为最终方法?因为我们尚未准备好覆盖它?
就是想...
注意:以下两个答案都是"正确"并提供良好信息的一些方法,但只能接受一个.
更新
我能够解决这个问题,问题是对话和相关的可以从广播接收器启动但不推荐,因为活动运行在视图之前结束。
尝试实现像 fb messenger、truecaller 等覆盖。
public class IncomingCall extends BroadcastReceiver
{
private Context pcontext;
private static final String TAG = "CustomBroadcastReceiver";
TelephonyManager telephony;
CustomPhoneStateListener customPhoneListener ;
@Override
public void onReceive(Context context, Intent intent)
{
pcontext = context;
Bundle extras = intent.getExtras();
if (extras != null) {
String state = extras.getString(TelephonyManager.EXTRA_STATE);
Log.w("DEBUG", state);
telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
customPhoneListener = new CustomPhoneStateListener();
telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
Bundle bundle = intent.getExtras();
String phoneNr= bundle.getString("incoming_number");
}
}
public class CustomPhoneStateListener extends PhoneStateListener
{
private static final …Run Code Online (Sandbox Code Playgroud) android android-layout android-xml android-view android-windowmanager
对于我的应用程序,我必须在android屏幕底部的导航栏顶部绘制一个位图.我很想知道WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY是否可用于覆盖导航栏?
我有以下问题 - 我有一个视图,我正在放入WindowManager,我希望它从屏幕出来到屏幕中间进行翻译动画.
不幸的是,无论我做什么,视图都坚持轴.
这是代码:
view = (FrameLayout) LayoutInflater.from(this).inflate(
R.layout.poke, null);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
300, 400, WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.verticalMargin = -10f;
params.gravity = Gravity.TOP;
windowManager.addView(view, params);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我尝试使用边距(放在那里减去它以使其上升).
顺便说一句 - 我知道在dimen.xml中输入数字而不是dp是很难看的.它只是一个测试代码..
我的应用程序有一个非常奇怪的问题。我有一项始终显示 ImageView 的服务。当用户与图像交互以使某些事情发生时,使用 onTouchListener。当服务关闭时,ImageView 将从窗口中删除(至少它应该如此)。
当我进行设置活动(这是一个片段)时,每次更改首选项时,我都会重新启动服务,以便在服务中进行更改。在重新启动期间,出于某种奇怪的原因,有时不会删除 ImageView。服务再次启动后,会在其顶部显示一个新的 ImageView。如果我完全关闭服务,“孤立” ImageView 只会停留在屏幕上,如果触摸它,应用程序就会崩溃。
这个错误是随机的。作为用户,我无法将它连接到特定的设置或操作;即使单击启用/禁用切换按钮几次,也可能发生错误。
设置片段
ToggleButton enableToggle = (ToggleButton)v.findViewById(R.id.enable_toggle);
enableToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
prefs.edit().putBoolean("HotSpotEnabled", isChecked).commit();
if(isChecked){
getActivity().stopService(new Intent(getActivity(),mysService.class));
getActivity().startService(new Intent(getActivity(),myService.class));
}
else{
getActivity().stopService(new Intent(getActivity(),myService.class));
}
}
});
Run Code Online (Sandbox Code Playgroud)
每当用户的首选项发生更改时,我都会使用此功能重新启动服务
public void restartService (){
if(myService.isRunning){
enabledToggle.setChecked(false);
final Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
enabledToggle.setChecked(true);
}
}, 1000);
}
}
Run Code Online (Sandbox Code Playgroud)
(我使用切换来重新启动服务而不是 stopService();-startService(); 因为由于某种原因,这种问题不太常见) …
我想尝试长按一下EditText,但是当我做长按时,我会收到以下错误.我希望能够长按一次以获取"复制/粘贴/全选"上下文弹出窗口,以便用户可以将文本粘贴到框中.
Fatal Exception: android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@799bfc6 is not valid; is your activity running?
Run Code Online (Sandbox Code Playgroud)
EditText位于PopupWindow的ScrollView中.因此,当错误发生时,我当前在PopupWindow打开的Activity上处于活动状态,并且我在PopupWindow中包含的EditText中进行长按.
Gradle设置
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
applicationId 'com.accoservice.cico'
minSdkVersion 17
targetSdkVersion 25
versionCode 37
versionName '4.2.6'
multiDexEnabled true
}
Run Code Online (Sandbox Code Playgroud)
包含EditText的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/outer_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#73000000">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="100dp"
android:layout_marginBottom="5dp"
android:background="#ffffff"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="15dp"
android:singleLine="true"
android:text="@string/note_msg"
android:textColor="#62CCFE"
android:textSize="18sp" />
<View
android:layout_width="fill_parent"
android:layout_height="2dp"
android:layout_marginBottom="5dp"
android:layout_marginTop="10dp"
android:background="#62CCFE" />
<ScrollView
android:id="@+id/sv_resolution_note"
android:layout_width="match_parent" …Run Code Online (Sandbox Code Playgroud) android android-layout android-view android-windowmanager android-window
我想实现三件事情在同一时间:
解决方案
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud)
只能达到1和3;
这里的解决方案只能达到1和2;
而且这里的解决方案只能达到2和3。
那么有没有办法实现1、2和3?
android statusbar android-view android-windowmanager android-window
的文档WindowManager.removeViewImmediate()包含警告(重点为我):
它的特殊变体在返回之前
ViewManager.removeView(View)立即调用给定视图层次结构的View.onDetachedFromWindow()方法。这不是正常应用;正确使用它需要非常小心。
我很好奇“精心护理”在这里意味着什么。大概这表明除非我知道如何处理使用该方法的所有副作用,否则我不应该调用此方法……但是我什至不知道这些副作用可能是什么。
考虑以下活动,我尽可能将其制成。没有遗漏的代码(除了导入),并且Activity的主题只是一个普通的AppCompat主题:
public class MainActivity extends AppCompatActivity {
private View overlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().getDecorView().post(() -> {
overlay = new View(this);
overlay.setBackgroundColor(Color.RED);
WindowManager.LayoutParams params =
new WindowManager.LayoutParams(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindowManager().addView(overlay, params);
});
}
@Override
protected void onDestroy() {
super.onDestroy();
getWindowManager().removeView(overlay);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行我的应用程序并将设备从纵向旋转到横向(或导致其被破坏和重新创建的任何其他方式)时,这将显示在日志中:
Run Code Online (Sandbox Code Playgroud)2018-10-09 13:58:02.162 11270-11270/com.example.stackoverflow E/WindowManager: android.view.WindowLeaked: Activity com.example.stackoverflow.MainActivity has leaked window android.view.View{e99861 V.ED..... ........ 0,0-1080,1920} that was originally added here at android.view.ViewRootImpl.<init>(ViewRootImpl.java:511) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) at …