2016-08-12 2 views
0

위, 아래, 왼쪽, 오른쪽의 네 가지 imagebutton을 포함하는 유동 레이아웃을 만들었습니다. 레이아웃에 액세스 (이동) 할 수는 있지만 네 개의 이미지 버튼에 onclicklistener를 설정할 수 없었습니다. 여기 플로팅 이미지 버튼에 리스너 설정?

내 코드입니다 :

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" /> 

자바 코드 : 다른에 명시된대로 (각 ImageButtonsetOnClickListener 방법을 사용할 수 있습니다

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

왜 '서비스'를 확장하고 있습니까? 당신은'Dialog'에서 같은 레이아웃을 할 수 있습니까? –

+0

아니요. 화면에 표시 될 떠 다니는 조이스틱을 만들고 싶기 때문에 사용자가 집 버튼을 클릭하더라도 화면에 있어야합니다. – Abhishek

답변

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

덕분에 – Abhishek

+0

좋습니다. 대답에 동의 표시를하십시오. – nshmura

0

하나 솔루션) 또는 귀하의 클래스를 구현할 수 onClickListener에서 View 그리고 로직을 아래 그림과 같이 임의의 뷰의 클릭 이벤트에 대한 onClick 메소드 내에서 처리합니다.

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; 

     } 
    } 

}