2011-12-25 5 views
0

아래 코드를 수정하는 데 도움을주십시오. Android 원격 애플리케이션의 마우스 패드보기를 만들고 있습니다. Android RelativeLayout 내 마우스 패드보기

public class MousePadView extends RelativeLayout { 

    private float scale; 

    // MOUSE BUTTONS LEFT CLICK, MIDDLE CLICK, RIGHT CLICK 

    private LinearLayout layoutMouseButtonBody; 
    private RelativeLayout.LayoutParams paramsMouseButtonBody; 

    private Button left; 
    private Button middle; 
    private Button right; 
    private LinearLayout.LayoutParams paramsButtons; 

    // BUTTONS FOR MOUSEWHEEL (UP AND DOWN) 

    private LinearLayout layoutWheelsBody; 
    private RelativeLayout.LayoutParams paramsWheelBody; 
    private Button up; 
    private Button down; 
    private LinearLayout.LayoutParams paramsWheelButton; 

    public MousePadView2(Context context, AttributeSet attrs, int defStyle) { // CONSTRUCTOR 
     super(context, attrs, defStyle); 
     scale = context.getResources().getDisplayMetrics().density; // GET SCALE FOR CONVERTING DPI TO PIXELS 

     // MOUSE BUTTON LAYOUT 

     paramsButtons = new LinearLayout.LayoutParams(DpiToPixels(0), LayoutParams.WRAP_CONTENT, 1); 
     left = new Button(context); 
     left.setText("L"); 
     left.setLayoutParams(paramsButtons); 
     middle = new Button(context); 
     middle.setText("M"); 
     middle.setLayoutParams(paramsButtons); 
     right = new Button(context); 
     right.setText("R"); 
     right.setLayoutParams(paramsButtons); 

     paramsMouseButtonBody = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
     paramsMouseButtonBody.addRule(ALIGN_PARENT_BOTTOM); // RELATIVE LAYOUT RULES 
     paramsMouseButtonBody.addRule(ALIGN_PARENT_LEFT); // RELATIVE LAYOUT RULES 
     paramsMouseButtonBody.addRule(ALIGN_PARENT_RIGHT); // RELATIVE LAYOUT RULES 
     layoutMouseButtonBody = new LinearLayout(context); 
     layoutMouseButtonBody.setBackgroundResource(android.R.drawable.bottom_bar); 
//  layoutMouseButtonBody.setPadding(0, DpiToPixels(4), 0, 0); 
     layoutMouseButtonBody.setOrientation(LinearLayout.HORIZONTAL); 
     layoutMouseButtonBody.setLayoutParams(paramsMouseButtonBody); 
     layoutMouseButtonBody.addView(left); 
     layoutMouseButtonBody.addView(middle); 
     layoutMouseButtonBody.addView(right); 

     // WHEELS 

     paramsWheelButton = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     up = new Button(context); 
     up.setText("U"); 
     up.setLayoutParams(paramsWheelButton); 
     down = new Button(context); 
     down.setText("D"); 
     down.setLayoutParams(paramsWheelButton); 

     paramsWheelBody = new RelativeLayout.LayoutParams(DpiToPixels(32), LayoutParams.WRAP_CONTENT); 
     paramsWheelBody.addRule(LEFT_OF, layoutMouseButtonBody.getId()); 
     paramsWheelBody.addRule(ALIGN_PARENT_BOTTOM); 
     layoutWheelsBody = new LinearLayout(context); 
     layoutWheelsBody.setOrientation(LinearLayout.VERTICAL); 
     layoutWheelsBody.setBackgroundResource(android.R.drawable.bottom_bar); 
     layoutWheelsBody.setLayoutParams(paramsWheelBody); 
     layoutWheelsBody.addView(up); 
     layoutWheelsBody.addView(down); 

     // PARENT 
     setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     addView(layoutMouseButtonBody); // add mousebutton layout in parent (relativelayout) 
     addView(layoutWheelsBody); // add mousewheel button layout in parent (relativelayout) 
    } 


    private int DpiToPixels(int dp) { 
     return (int)(dp * scale + 0.5f); // converting DPI to Pixels 
    } 

} 

The output generated by Android SDK This is the output that I want

왼쪽의 이미지

안드로이드 SDK에 의해 생성 된 출력과 오른쪽에 하나는 내가 원하는 출력됩니다.

도와주세요.

XML에서 레이아웃을 확장하고 싶지 않습니다.

+0

여전히 코드를 제안 할 수 있습니다. :) –

+0

나는이 생성자에게 공공 MousePadView (컨텍스트 컨텍스트의 AttributeSet attrs에) { \t를 추가 LayoutInflaterException 있어이 (문맥 attrs에, 0); \t \t // TODO 자동 생성 생성자 스터브 \t} \t 공개 MousePadView (컨텍스트 컨텍스트) { \t \t이 (문맥, NULL, 0); \t \t // TODO 자동 생성 생성자 스텁 \t} –

답변

0

나는 당신이 찾고있는 것을 달성하는 유일한 방법은 휠과 버튼 레이아웃을 다른 레이아웃으로 그룹화하는 것입니다. 그 후에 결과를 상위의 맨 아래에 정렬하기 만하면됩니다.

이런 식 추가 : 하단과 함께 모든 방법 :

LayoutParams paramsTotal = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
paramsTotal.addRule(ALIGN_PARENT_BOTTOM); 
LinearLayout layoutTotal = new LinearLayout(context); 
layoutTotal.setOrientation(LinearLayout.VERTICAL); 
layoutTotal.setLayoutParams(paramsTotal); 
layoutTotal.addView(layoutWheelsBody); 
layoutTotal.addView(layoutMouseButtonBody); 

// PARENT 
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
addView(layoutTotal); // add the combined layout 

휠 오른쪽 마우스 버튼 위의 버튼 (직접 휠 버튼 아래에 마우스 버튼 또는 그 반대의 경우도 마찬가지)를 배치해야 .

// 편집 : 대신, 루트 레이아웃을 LinearLayout으로 만들고 상단에 가중치가 1 인 더미 뷰를 추가하여 다른 요소를 아래쪽으로 내릴 수 있습니다. 아마 RelativeLayout 옵션을 선호 할 것입니다.

궁금증에서 벗어나서 : 그냥 레이아웃을 팽창시키지 않는 이유는 무엇입니까? 개인적으로 나는 그 방법을 더 managable 찾으십시오.

+0

코드 주셔서 감사합니다. 좋은 코드. :) 왜? 나는 활동, 사용자 정의 대화 상자 및 목록보기에 대한 사용자 정의 항목에 대한 레이아웃과 같은 내 프로젝트에서 많은 XML 레이아웃이 있습니다 :) 또 다른 이유 : Experience :) –

0

레이아웃 관리가 엉망입니다. 이 코드를 사용하는 것이 좋습니다 :

 // MOUSE BUTTON LAYOUT 

     paramsButtons = new LinearLayout.LayoutParams(DpiToPixels(0), LayoutParams.WRAP_CONTENT, 1); 
     left = new Button(context); 
     left.setText("L"); 
     middle = new Button(context); 
     middle.setText("M"); 
     right = new Button(context); 
     right.setText("R"); 

     paramsMouseButtonBody = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); 
     paramsMouseButtonBody.addRule(ALIGN_PARENT_BOTTOM); // RELATIVE LAYOUT RULES 

     layoutMouseButtonBody = new LinearLayout(context); 
     layoutMouseButtonBody.setBackgroundResource(android.R.drawable.bottom_bar); 
//  layoutMouseButtonBody.setPadding(0, DpiToPixels(4), 0, 0); 
     layoutMouseButtonBody.setOrientation(LinearLayout.HORIZONTAL); 
     layoutMouseButtonBody.addView(left, paramsButtons); 
     layoutMouseButtonBody.addView(middle, paramsButtons); 
     layoutMouseButtonBody.addView(right, paramsButtons); 

     // WHEELS 

     paramsWheelButton = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     up = new Button(context); 
     up.setText("U"); 
     down = new Button(context); 
     down.setText("D"); 

     paramsWheelBody = new RelativeLayout.LayoutParams(DpiToPixels(32), LayoutParams.WRAP_CONTENT); 
     paramsWheelBody.addRule(ABOVE, layoutMouseButtonBody.getId()); 

     layoutWheelsBody = new LinearLayout(context); 
     layoutWheelsBody.setOrientation(LinearLayout.VERTICAL); 
     layoutWheelsBody.setBackgroundResource(android.R.drawable.bottom_bar); 
     layoutWheelsBody.addView(up, paramsWheelButton); 
     layoutWheelsBody.addView(down, paramsWheelButton); 

     // PARENT 
     setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     addView(layoutMouseButtonBody, paramsMouseButtonBody); // add mousebutton layout in parent (relativelayout) 
     addView(layoutWheelsBody, paramsWheelBody); // add mousewheel button layout in parent (relativelayout) 
+0

제안 해 주셔서 감사합니다. :) –

+0

그것은 당신을 위해 작동합니까? 그렇다면 대답을 수락하는 것을 고려해주십시오. – Anton

+0

@Anton :'paramsWheelBody.addRule (ABOVE, layoutMouseButtonBody.getId()); '라고하면 레이아웃이 화면 상단에 위치하게됩니다. 바닥에있는 버튼의 위에 직접 위치하도록 레이아웃을 알려주는 것은 아무것도 없습니다 ... –