【问题标题】:Why would my background disappear when adding a button?为什么添加按钮时我的背景会消失?
【发布时间】:2011-12-09 23:30:19
【问题描述】:

为什么下面的代码会失败?

我的 main.xml 中有一个蓝色的 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>

【问题讨论】:

  • 可能与您为新按钮设置的 viewgroup.layoutparams 有关,我不确定,将不得不摆弄它;)在您添加后尝试无效?
  • 我玩弄了 layoutparams 设置,但没有运气。尝试使用 addView( btn, 100, 100 ) 来避免 layoutparams。我已经尝试过 invalidate() 和 invalidateRect(..)。当我在视图上调用 getDrawingRect() 时,我得到了整个画布矩形,这样看起来还可以。

标签: android


【解决方案1】:

我认为问题出在 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"/>

【讨论】:

  • 感谢您的建议,我希望这可以解决问题。但我仍然看到这个问题。我更新了上面的代码以显示我目前拥有的内容。
  • 我只是真的简化了代码,在 xml 中设置了 bg 颜色,我没有在 onCreate() 中添加按钮。开始怀疑是否将其添加到侦听器中是问题所在。不知道为什么。
  • 好吧,试试 vw.postInvalidate();代替 vw.invalidate();并在您的 onTouch() 方法中删除 btn.invalidate()。
  • 你去!非常感谢。汇款按钮在哪里?我唯一的犹豫是它引入了一些闪烁,我可以忍受。我只是不明白为什么在这种情况下需要发布失效,似乎 invalidate() 可以解决问题。
  • 否,因为只有在 UI 线程上才应该使用 invalidate()。欲了解更多信息,请查看文档:developer.android.com/reference/android/view/….
【解决方案2】:

我不确定错误是否来自于此,但您没有使用正确的布局参数。 您应该用于视图的布局参数是来自父级的参数。 在您的情况下,您应该为按钮使用 RelativeLayout.LayoutParams,我想为您的相对布局使用 FrameLAyout.LayoutParams。

【讨论】:

  • 谢谢,很高兴知道即使它没有引起这个问题。我更新了上面的代码(仍然中断)。
猜你喜欢
  • 2014-05-24
  • 2017-03-18
  • 2019-04-01
  • 2016-11-16
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多