2011-12-09 6 views
2

아래 코드는 왜 실패할까요?버튼을 추가 할 때 내 배경이 사라지는 이유는 무엇입니까?

내 main.xml에 파란색 relativeLayout이 있습니다. 클릭시 녹색 버튼이 추가됩니다.

내 Motorola Xoom에서 실행할 때 화면을 클릭하면 녹색 버튼이 표시되지만 파란색이 검은 색으로 바뀝니다. 다시 클릭하면 파란색 배경이 표시됩니다. 다시 클릭하면 검정색이 보입니다 ...

무엇이 누락 되었습니까?

도움 주셔서 감사합니다.

package com.android.mikeviewtester; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RelativeLayout; 

public class ViewTesterActivity extends Activity { 

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

     // set the relative layout as our view 
     setContentView(R.layout.main); 

     RelativeLayout currentView = (RelativeLayout) findViewById(R.id.MyRelativeLayout); 

     // set a listener 
     currentView.setOnTouchListener((android.view.View.OnTouchListener) mOnTouchListener); 
    } 

    private android.view.View.OnTouchListener mOnTouchListener = new android.view.View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 

      if (v != null) 
       v.onTouchEvent(event); 

      if (event.getAction() == MotionEvent.ACTION_UP) { 

       android.widget.RelativeLayout vw = (android.widget.RelativeLayout) findViewById(R.id.MyRelativeLayout); 

       // create and add a new cyan button 
       Button btn = new Button(ViewTesterActivity.this); 
       btn.setBackgroundColor(Color.GREEN); 
       vw.addView(btn, 100, 100); 
       vw.invalidate(); 
       btn.invalidate(); 
      } 

      return true; 
     } 
    }; 
} 

main.xml에

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/MyRelativeLayout" 
    android:background="#0000FF"> 
</RelativeLayout> 
+1

당신이 새 단추에 대해 설정 한 viewgroup.layoutparams 함께 할 수있는 뭔가가있을 수도 있습니다, 잘 모르겠어요 , 그것을 함께 피들해야 할 것이다;) tryed 당신이뿐만 아니라 추가 후 무효화? – Warpzit

+0

행운과 함께 layoutparams 설정으로 놀았습니다. addView (btn, 100, 100)를 사용하여 레이아웃 매개 변수를 모두 사용하지 않으려 고 시도했습니다. 나는 invalidate()와 invalidateRect (..)를 시도했다. 뷰에서 getDrawingRect()를 호출하면 전체 캔버스가 올바르게 표시되므로 괜찮습니다. – SkolVikingsGuy

답변

2

문제는 onCreate()의 en에서 setContentView() 메서드를 호출하면 발생한다고 생각합니다. 그렇게해야 그

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // set the relative layout as our view 
    setContentView(R.layout.main); 
    currentView = (RelativeLayout)findViewById(R.id.main); 

    // create a red button 
    Button btn = new Button(this); 
    btn.setBackgroundColor(Color.RED); 
    Relative.LayoutParams params = new Relative.LayoutParams(100, 100); 
    currentView.addView(btn, params); 

    // setup the view (blue background) 
    currentView.setBackgroundColor(Color.BLUE); 
    currentView.setOnTouchListener((android.view.View.OnTouchListener) mOnTouchListener); 
} 

그리고 당신의 main.xml에 파일처럼 시도 :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/main" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
+0

조언을 주셔서 감사합니다, 그 트릭을 할 것이라고 기대했다. 그러나 나는 아직도 그 문제를 안다. 위의 코드를 업데이트하여 현재 가지고있는 것을 보여줍니다. – SkolVikingsGuy

+0

저는 XML에서 bg 색상을 설정하고 onCreate()에 버튼을 추가하지 않고 코드를 단순화했습니다. 리스너에 추가하는 것이 문제인지 궁금해하기 시작합니다. 왜 그래도. – SkolVikingsGuy

+1

그래, 그럼 vw.postInvalidate() 시도해보십시오; vw.invalidate() 대신에; onTouch() 메서드에서 btn.invalidate()를 제거하십시오. – jobesu14

1

나는 오류가에서오고 있지만 제대로 레이아웃 PARAMS를 사용하지 않는 있는지 모르겠습니다. 뷰에 사용해야하는 레이아웃 매개 변수는 부모로부터 오는 params입니다. 당신의 경우 RelativeLayout.LayoutParams 버튼을 사용해야하고, 상대 레이아웃을위한 FrameLAyout.LayoutParams라고 가정합니다.

+0

고마워,이 문제를 일으키지 않아도 알아두면 좋다. 나는 위의 코드를 업데이트했다. – SkolVikingsGuy

관련 문제