2017-06-19 2 views
-1

Ich habe eine Overlay-Schaltfläche in meiner Android-App. Ich möchte ein Layout anzeigen und mit den Ansichten meines Layouts interagieren, wenn der Benutzer auf die Schaltfläche klickt. Für den Moment zeige ich einen Toast. Wie kann ich das machen ?Ein Popup anzeigen, wenn Benutzer auf die Überlagerungsschaltfläche klicken

Das ist mein OverlayShowingService.class ist:

public class OverlayShowingService extends Service implements OnTouchListener, OnClickListener { 

    private View topLeftView; 

    private Button overlayedButton; 
    private float offsetX; 
    private float offsetY; 
    private int originalXPos; 
    private int originalYPos; 
    private boolean moving; 
    private WindowManager wm; 

    @Override 
    public IBinder onBind(Intent intent) { 
    return null; 
    } 

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

    wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 

    overlayedButton = new Button(this); 
    overlayedButton.setText("Overlay button"); 
    overlayedButton.setOnTouchListener(this); 
    overlayedButton.setBackgroundColor(Color.BLACK); 
    overlayedButton.setOnClickListener(this); 

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.LEFT | Gravity.TOP; 
    params.x = 0; 
    params.y = 0; 
    wm.addView(overlayedButton, params); 

    topLeftView = new View(this); 
    WindowManager.LayoutParams topLeftParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); 
    topLeftParams.gravity = Gravity.LEFT | Gravity.TOP; 
    topLeftParams.x = 0; 
    topLeftParams.y = 0; 
    topLeftParams.width = 0; 
    topLeftParams.height = 0; 
    wm.addView(topLeftView, topLeftParams); 

    } 

    @Override 
    public void onDestroy() { 
    super.onDestroy(); 
    if (overlayedButton != null) { 
     wm.removeView(overlayedButton); 
     wm.removeView(topLeftView); 
     overlayedButton = null; 
     topLeftView = null; 
    } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     float x = event.getRawX(); 
     float y = event.getRawY(); 

     moving = false; 

     int[] location = new int[2]; 
     overlayedButton.getLocationOnScreen(location); 

     originalXPos = location[0]; 
     originalYPos = location[1]; 

     offsetX = originalXPos - x; 
     offsetY = originalYPos - y; 

    } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
     int[] topLeftLocationOnScreen = new int[2]; 
     topLeftView.getLocationOnScreen(topLeftLocationOnScreen); 

     System.out.println("topLeftY="+topLeftLocationOnScreen[1]); 
     System.out.println("originalY="+originalYPos); 

     float x = event.getRawX(); 
     float y = event.getRawY(); 

     WindowManager.LayoutParams params = (LayoutParams) overlayedButton.getLayoutParams(); 

     int newX = (int) (offsetX + x); 
     int newY = (int) (offsetY + y); 

     if (Math.abs(newX - originalXPos) < 1 && Math.abs(newY - originalYPos) < 1 && !moving) { 
     return false; 
     } 

     params.x = newX - (topLeftLocationOnScreen[0]); 
     params.y = newY - (topLeftLocationOnScreen[1]); 

     wm.updateViewLayout(overlayedButton, params); 
     moving = true; 
    } else if (event.getAction() == MotionEvent.ACTION_UP) { 
     if (moving) { 
     return true; 
     } 
    } 

    return false; 
    } 

    @Override 
    public void onClick(View v) { 
    Toast.makeText(this, "Here I want to show a layout with some options in a box", Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

einfach mache einen anderen Dienst mit View und zeige ihn 'onClick' an –

+0

Was hält dich davon ab, dieses Layout aufzublasen und es über' WindowManager # addView() 'hinzuzufügen, wie du es für diese Schaltfläche getan hast? – azizbekian

+0

Wie folgt: wm.addView (MY_VIEW, params); ? Aber ich möchte ein Layout wie dieses R.layout.overlay einstellen. Wie kann ich das in View konvertieren? –

Antwort

1

Senden Sie eine Sendung, wenn Sie auf die Schaltfläche klicken, und starten Sie die Aktivität von Broadcast receivers onReceive-Methode.

Erstellen Sie einen Broadcast-Empfänger, registrieren Sie einen Broadcast-Empfänger onCreate() Ihres Dienstes dann. Broadcast Intent beim Klicken auf die Schaltfläche. Schließlich öffnet der Empfänger eine Aktivität (Layout), wenn auf die Überlagerungstaste geklickt wird.

Wenn Sie nur einen Dialog öffnen wollten, ist dies eine gute Antwort. https://stackoverflow.com/a/31221355/4179914

Schaltet man aus können auch Thema eine Aktivität wie ein Dialog wie hier erwähnt https://stackoverflow.com/a/7918720/4179914

public class OverlayClickReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Intent toDialog = new Intent(context, Main2Activity.class); 
     toDialog.setFlags(FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(toDialog); 
    } 
} 

Broadcast-Senden auf Overlay-Schaltfläche geklickt.

@Override 
    public void onClick(View v) { 
     broadcastClick(); 
    } 

    private void broadcastClick() { 
     final Intent intent = new Intent("user.clicked.overlay.button"); 
     final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this); 
     broadcastManager.sendBroadcast(intent); 
    } 

Empfänger Register Broadcast-onCreate()

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

     overlayShowing = new OverlayClickReceiver(); 
     ....... 
    } 

    private void registerClickReceiver() { 
     LocalBroadcastManager.getInstance(this).registerReceiver(overlayShowing, 
       new IntentFilter("user.clicked.overlay.button")); 
    } 

Unregister Rundfunkempfänger onDestroy()

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


    private void unregisterClickReceriver() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(overlayShowing); 
    } 
+0

Kommentar wenn Hilfe benötigt wird, ich habe es getestet und es funktioniert. –

0

Von dem, was ich von der Frage zu verstehen, wollen Sie eine Ansicht Form von XML-Dateien erhalten und es zu einem Fenster hinzuzufügen.

Sie können View view = LayoutInflater.from(context).inflate(r.layout.overlay,null,false); verwenden und das view mit WindowManager.addView(view) zu dem Fenster hinzufügen.

Verwandte Themen