2016-11-21 3 views
0

ich baue eine app für android mit android studio, und wenn ich die app direkt auf meinem handy laufen, stürzt es ab, wenn ich einen FloatingViewService auf taste klicken. Ich muss es auf meinem Handy laufen lassen, weil ich keine Virtualisierung auf meinem Laptop habe.android floating view bubble

Und ja, ich habe fügen Sie die Erlaubnis:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 

Und ich erklärte auch FloatingViewService in der AndroidManifest.xml Datei:

<service android:name=".FloatingViewService" /> 

Aber noch kein Glück. Was mache ich falsch?

Hier ist meine gesamte Code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context="com.icetea09.demofloatingview.MainActivity"> 

<Button 
    android:id="@+id/btn_show_floating_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="Show Floating View"/> 

import android.app.Service; 
import android.content.Intent; 
import android.graphics.PixelFormat; 
import android.os.IBinder; 
import android.view.Gravity; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class FloatingViewService extends Service { 

private WindowManager mWindowManager; 
private ImageView mImgFloatingView; 
private boolean mIsFloatingViewAttached = false; 

@Override 
public IBinder onBind(Intent intent) { 
    //Not use this method 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if(!mIsFloatingViewAttached){ 
     mWindowManager.addView(mImgFloatingView, mImgFloatingView.getLayoutParams()); 
    } 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

    mImgFloatingView = new ImageView(this); 
    mImgFloatingView.setImageResource(R.mipmap.ic_launcher); 

    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.TOP | Gravity.LEFT; 

    mWindowManager.addView(mImgFloatingView, params); 

    mIsFloatingViewAttached = true; 

    mImgFloatingView.setOnTouchListener(new View.OnTouchListener() { 
     private int initialX; 
     private int initialY; 
     private float initialTouchX; 
     private float initialTouchY; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        initialX = params.x; 
        initialY = params.y; 
        initialTouchX = event.getRawX(); 
        initialTouchY = event.getRawY(); 
        return true; 
       case MotionEvent.ACTION_UP: 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        params.x = initialX + (int) (event.getRawX() - initialTouchX); 
        params.y = initialY + (int) (event.getRawY() - initialTouchY); 
        mWindowManager.updateViewLayout(mImgFloatingView, params); 
        return true; 
      } 
      return false; 
     } 
    }); 
} 

public void removeView() { 
    if (mImgFloatingView != null){ 
     mWindowManager.removeView(mImgFloatingView); 
     mIsFloatingViewAttached = false; 
    } 
} 

@Override 
public void onDestroy() { 
    Toast.makeText(getApplicationContext(), "onDestroy", Toast.LENGTH_SHORT); 
    super.onDestroy(); 
    removeView(); 
} 

}

public class MainActivity extends ActionBarActivity implements View.OnClickListener{ 

private Button mBtnShowView; 
private boolean mIsFloatingViewShow; //Flag variable used to identify if the Floating View is visible or not 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mBtnShowView = (Button)findViewById(R.id.btn_show_floating_view); 
    mBtnShowView.setOnClickListener(this); 
    mIsFloatingViewShow = false; 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.btn_show_floating_view: 
      if(mIsFloatingViewShow){ 
       hideFloatingView(); 
       mIsFloatingViewShow = false; 
       mBtnShowView.setText(R.string.show_floating_view); 
      } 
      else{ 
       showFloatingView(); 
       mIsFloatingViewShow = true; 
       mBtnShowView.setText(R.string.hide_floating_view); 
      } 
      break; 
    } 
} 

private void showFloatingView() { 
    startService(new Intent(getApplicationContext(), FloatingViewService.class)); 
} 

private void hideFloatingView() { 
    stopService(new Intent(getApplicationContext(), FloatingViewService.class)); 
} 

}

+0

Können Sie den Stack-Trace aus dem "Android Monitor" Tab im Android Studio schreiben? – Joris

+0

https://postimg.org/image/gpwq5k97b/ – Denzel

+0

das eigentliche Problem ist, dass ich diese App von Github herunterspielen und dann den Code (alle Klassen, Manifest, Resourses alle) verschreiben und meine App abstürzt, wenn ich auf den Button Show klicke Schwimmende Ansicht. WARUM ist das so, dass ich nicht verstehe :( – Denzel

Antwort

0

Verwenden

WindowManager.LayoutParams.TYPE_TOAST 

statt

WindowManager.LayoutParams.TYPE_PHONE 
Verwandte Themen