解决方案 »

  1.   

    windowmanager addview 那对应用removeView 试试,不知道你具体要做什么逻辑。
      

  2.   

    我知道removeView( ),现在我是想要通过监听返回按钮然后执行removeView( ),就是我addView( ),然后按下返回按钮时removeView( )
      

  3.   

    这个应该可以啊,只要View的实例对象还没改变 是可以removeView的。
      

  4.   

    是想要通过监听返回按钮然后执行removeView( ),就是我addView( ),然后按下返回按钮时removeView( )现在关键就在于如何写这个监听事件,我一重写View就出错了
      

  5.   

    问题不在于removeVIew()不能用,而是放在哪里用?
      

  6.   

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) { // 监控/拦截/屏蔽返回键
            //返回键你要干啥,如果不写super.onKeyDown(keyCode, event);的话,相当于拦截返回键,没有真正的返回效果。
    } else if (keyCode == KeyEvent.KEYCODE_MENU) {
    return super.onKeyDown(keyCode, event);
    //do something
    } else if (keyCode == KeyEvent.KEYCODE_HOME) {
    return super.onKeyDown(keyCode, event);
    }else{
    return super.onKeyDown(keyCode, event);
    }
    }少侠,我就帮你到这了
      

  7.   


    关键就是这段代码放在哪里,之前我重写view 然后放了这些类似的代码,但是报错,说是视图对象转换出错,因为我的视图是通过LayoutInflate的inflate( )方法生成的。
      

  8.   

    这个代码onKeyDown与Activity中的onCreate等同级。至于你说的视图转换出错,肯定是你的view管理逻辑有问题,上代码
      

  9.   


    class EnterPassView extends View { public EnterPassView(Context context) {
    super(context);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    Message message = viewHandler.obtainMessage(0);
    viewHandler.sendMessage(message);
    return super.dispatchKeyEvent(event);
    } else if(event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
    Message message = viewHandler.obtainMessage(0);
    viewHandler.sendMessage(message);
    return super.dispatchKeyEvent(event);
    } else if(event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
    Message message = viewHandler.obtainMessage(0);
    viewHandler.sendMessage(message);
    return super.dispatchKeyEvent(event);
    }
    return super.dispatchKeyEvent(event);
    }private void showGestureLockView() {
    params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
    PixelFormat.RGBA_8888);
    params.gravity = (Gravity.CENTER);

    LayoutInflater layoutInflater = 
    (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    enterPassView = layoutInflater.inflate(R.layout.activity_enterpass, null);
                    
                    gesturePassView = (GesturePassView) enterPassView.findViewById(R.id.enterpass_view_gpv);
    gesturePassView.setSavedPass(savePass);
    gesturePassView.setScene(0);
    gesturePassView.setOnGestureCompleteListener(new OnGestureCompleteListener() {

    @Override
    public void onGestureComplete(int result, String enterPassword) {
    if(result == 0) {
    iv_icon.setAnimation(animation);
    tv_text.setText(R.string.enterpass_lesspass);
    } else if(result == 1){
    Message message = viewHandler.obtainMessage(0);
    viewHandler.sendMessage(message);
    Log.e("sendMessage", "pass is true want to remove view");
    } else if(result == -1){
    iv_icon.setAnimation(animation);
    tv_text.setText(R.string.enterpass_wrongpass);
    }
    }
    });

    if(windowsManager == null) {
    windowsManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    }
    if(windowsManager != null && enterPassView != null) {
    Message message = viewHandler.obtainMessage(1);
    viewHandler.sendMessage(message);
    Log.e("sendMessage", "want to addView");
    }

    }

    Handler viewHandler = new Handler() {

    @Override
    public void handleMessage(Message message) {
    int flag = message.what;
    if(flag == 1) {
    windowsManager.addView(enterPassView, params);
    Log.e("sendMessage", "addView");
    } else if(flag == 0) {
    windowsManager.removeView(enterPassView);
    enterPassView = null;
    Log.e("sendMessage", "removeView");
    }

    }

    };
      

  10.   


    MainActivity.java
    public class MainActivity extends Activity { @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent(MainActivity.this, MyService.class);
    startService(intent);
    }}MyService.java
    public class MyService extends Service {

    Thread thread;
    WindowManager windowsManager = null;
    WindowManager.LayoutParams params;
    View view; @Override
    public IBinder onBind(Intent intent) {
    return null;
    } @Override
    public void onCreate() {
    super.onCreate();
    new Handler().postDelayed(new Runnable() { @Override
    public void run() {
    showView();
    }

    }, 5000);
    } @Override
    public void onDestroy() {
    super.onDestroy();
    }

    private void showView() {
    params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
    PixelFormat.RGBA_8888);
    params.gravity = (Gravity.CENTER);
    LayoutInflater layoutInflater = 
    (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = layoutInflater.inflate(R.layout.view_service, null);
    if(windowsManager == null) {
    windowsManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    }
    if(windowsManager != null && view != null) {
    Message message = addViewHandler.obtainMessage(1);
    addViewHandler.sendMessage(message);
    }

    }

    Handler addViewHandler = new Handler() {

    @Override
    public void handleMessage(Message message) {
    int flag = message.what;
    if(flag == 1) {
    windowsManager.addView(view, params);
    } else if(flag == 0) {
    windowsManager.removeView(view);
    }
    }
    };}view_service.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#32CD32"
        android:gravity="center"
        android:orientation="vertical" >
        
        <ImageView 
            android:id="@+id/iv_icon"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:src="@drawable/ic_launcher"
            />
        
        <TextView 
            android:id="@+id/tv_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="hello android"
            android:textColor="#ffffff"
            android:textSize="16sp"
            />
        
    </LinearLayout>
    以上就是主要Demo代码,启动应用后,主Activity启动Service,在5秒延迟之后addView( ),此时我想要实现的功能是通过按返回键或者home键能够removeView( ).
      

  11.   

    你如果真心厉害,麻烦看下11楼,我写的Demo,帮忙解决问题
      

  12.   

    我发了一个Demo在11楼,麻烦看一下能不能实现监听返回键然后removeView()