2016-08-12 2 views
0

Ich habe ein schwebendes Layout erstellt, das vier Bildschaltflächen oben, unten, links, rechts enthält. Ich kann auf das Layout zugreifen (verschieben), aber ich konnte den Klick-Listener auf diesen vier Bildbuttons nicht einstellen.Hörer auf schwebendem Bildknopf einstellen?

Hier ist mein Code:

XML:

<ImageButton 
    android:id="@+id/down" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/up" 
    android:layout_below="@+id/left" 
    android:src="@drawable/ic_keyboard_arrow_down_black_24dp" /> 

<ImageButton 
    android:id="@+id/right" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/down" 
    android:layout_toRightOf="@+id/down" 
    android:src="@drawable/ic_keyboard_arrow_right_black_24dp" /> 

    <ImageButton 
    android:id="@+id/left" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/up" 
    android:layout_marginTop="20dp" 
    android:layout_toLeftOf="@+id/down" 
    android:src="@drawable/ic_keyboard_arrow_left_black_24dp" /> 

    <ImageButton 
    android:id="@+id/up" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="91dp" 
    android:src="@drawable/ic_keyboard_arrow_up_black_24dp" /> 

Java-Code:

public class FloatingWindow extends Service { 
    WindowManager wm; 
    RelativeLayout mInview; 


    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 


     wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     LayoutInflater inflater = LayoutInflater.from(getApplicationContext()); 
     mInview = (RelativeLayout)inflater.inflate(R.layout.prac, null, false); 


     RelativeLayout.LayoutParams layoutParameteres = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, 700); 


     final WindowManager.LayoutParams parameters = new WindowManager.LayoutParams(
       600, 400, WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 

     parameters.gravity = Gravity.CENTER | Gravity.CENTER; 
     parameters.x = 0; 
     parameters.y = 0; 



     Button  stop = new Button(this); 
    stop.setText("Stop"); 
     ViewGroup.LayoutParams btnParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
     stop.setLayoutParams(btnParameters); 

    mInview.addView(stop); 

     wm.addView(mInview, parameters); 




     mInview.setOnTouchListener(new View.OnTouchListener() { 

     WindowManager.LayoutParams updatedParameters = parameters; 
      double x; 
      double y; 
      double pressedX; 
      double pressedY; 

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

       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 

         x = updatedParameters.x; 
         y = updatedParameters.y; 



         pressedX = event.getRawX(); 
         pressedY = event.getRawY(); 

         break; 

        case MotionEvent.ACTION_MOVE: 
         updatedParameters.x = (int) (x + (event.getRawX() - pressedX)); 
         updatedParameters.y = (int) (y + (event.getRawY() - pressedY)); 

         wm.updateViewLayout(mInview, updatedParameters); 

        default: 
         break; 
       } 

       return false; 
      } 
     }); 

    stop.setOnClickListener(new View.OnClickListener() { 
     @Override 
      public void onClick(View v) { 
       wm.removeView(mInview); 
       stopSelf(); 
       System.exit(0); 
      } 
     }); 
    } 



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

} 
+0

Warum erweitern Sie "Service"? Kannst du das gleiche Layout in einem 'Dialog' machen? –

+0

Nein, weil ich Floating Joystick erstellen möchte, der auf dem Bildschirm angezeigt wird, und selbst wenn Benutzer auf die Home-Taste klickt, muss es auf dem Bildschirm angezeigt werden. – Abhishek

Antwort

0
public class FloatingWindow extends Service { 

    ... 

    @Override 
    public void onCreate() { 

     ... 

     mInview.findViewById(R.id.left).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ... 
      } 
     }); 

     mInview.findViewById(R.id.down).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ... 
      } 
     }); 

     mInview.findViewById(R.id.right).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ... 
      } 
     }); 

     mInview.findViewById(R.id.up).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ... 
      } 
     }); 

     ... 
    } 
} 
+0

danke es hat funktioniert – Abhishek

+0

Das ist gut. Bitte markieren Sie die Antwort akzeptiert – nshmura

0

Entweder Sie setOnClickListener Methode auf jeder ImageButton verwenden können (wie im anderen genannten Lösung) oder Sie können Ihre Klasse implementieren onClickListener von View und behandeln Sie die Logik innerhalb onClick Methode für Click-Ereignis einer beliebigen Ansicht wie unten gezeigt.

public class FloatingWindow extends Service implements View.OnClickListener{ 

    // ...... all other stuff 

    // handle onClick event for any view of the layout 
    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 

      case R.id.down: { 
       // do something id down click 
       break; 
      } 
      case R.id.right: { 
       // do something if right click 
       break; 
      } 
      case R.id.left: { 
       // do something if left click 
       break; 
      } 
      case R.id.up: { 
       // do something if up click 
       break; 
      } 
      default: // do nothing 
       break; 

     } 
    } 

}