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));
}
}
Können Sie den Stack-Trace aus dem "Android Monitor" Tab im Android Studio schreiben? – Joris
https://postimg.org/image/gpwq5k97b/ – Denzel
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