2011-12-09 44 views
2

以下のコードはなぜ失敗するのですか?ボタンを追加すると背景が消えるのはなぜですか?

main.xmlにblue relativeLayoutがあります。クリックすると緑色のボタンが追加されます。

モトローラの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)を使って試して、layoutparamsをすべて避けるようにしました。私は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を使用していないかどうかわかりません。 ビューに使用するレイアウトパラメータは、親からのパラメータです。 あなたの場合は、ボタンにRelativeLayout.LayoutParamsを使用する必要があります。相対レイアウト用にFrameLAyout.LayoutParamsを使用するとします。

+0

ありがとうございます、この問題を引き起こしていない場合でも知っておきましょう。上記のコードを更新しました。 – SkolVikingsGuy

関連する問題