更改视图的背景颜色?
Posted
技术标签:
【中文标题】更改视图的背景颜色?【英文标题】:Changing background color of a view? 【发布时间】:2013-01-07 16:14:43 【问题描述】:我想创建一个linear layout
的子类,它的背景颜色必须是黑色或白色。我写了这段代码:
public class MyLayout extends LinearLayout implements Runnable
int color = 0xFFFFFFFF;
public MyLayout(Context context)
super(context);
Thread t = new Thread(this);
t.start();
@Override
public void run()
while (true)
try
Thread.sleep(1000);
if(color == 0xFF000000)
color = 0xFFFFFFFF;
else
color = 0xFF000000;
this.setBackgroundColor(color);
postInvalidate();
System.out.println("Color >> " + color);
catch (Exception e)
e.printStackTrace();
然后我将它设置为我的 Activity 的 ContentView:
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(new MyLayout(this));
在模拟器中运行App后,MyLayout
的run
方法无异常执行,但是背景颜色总是黑色。我做错了什么?
【问题讨论】:
什么时候换颜色?请贴代码 你在 logcat 的System.out.println("Color >> " + color);
行得到了什么?
@CsehTamás 我正在尝试在run
方法中更改颜色。
@ρяσѕρєя K logcat 重复:颜色 >> -16777216 颜色 >> -1
【参考方案1】:
嗨,试试这个吧。
public class MyLayout extends LinearLayout implements Runnable
int color = 0xFFFFFFFF;
public MyLayout(Context context)
super(context);
myView = this;
Thread t = new Thread(this);
t.start();
private View myView;
@Override
public void run()
try
while (true)
Thread.sleep(1000);
runOnUiThread(new Runnable()
@Override
public void run()
// TODO Auto-generated method stub
if (color == 0xFF000000)
color = 0xFFFFFFFF;
else
color = 0xFF000000;
myView.setBackgroundColor(color);
postInvalidate();
System.out.println("Color >> " + color);
);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
当您想通过其他线程对用户界面进行任何更改时,请在 runOnUiThread 中运行您的代码。
【讨论】:
我试过了,但我得到了这个错误:方法 runOnUiThread(new Runnable()) 未定义 MyLayout 类型 @StudentStudent 也许你可以将我的答案标记为正确,如果这真的有帮助的话【参考方案2】:在你尝试过 postInvalidate() 的地方尝试 invalidate()
其他提示: 您正在创建一个新的 LinearLayout,没有指定布局大小。 我建议你在使用 setContentView 之前使用 setLayoutParams():
MyLayout layout = new MyLayout(this);
layout.setLayoutParams(new LayoutParams(...));
this.setContentView(layout);
此时,您正在创建一个大小为 0 的新布局(高度和宽度)
【讨论】:
我尝试了 invalidate() 而不是 postInvalidate() 和这个 layoutparams :"LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT);"但没有任何改变。 你设置 lp 实例到布局了吗? 感谢您的关注。请查看我的回答。+1 为您的有用知识投票。【参考方案3】:你不能在线程中使用异步任务来改变它
https://developer.android.com/reference/android/os/AsyncTask.html
protected void onPostExecute(Long result)
//HERE YOU CAN CHANGE THE COLOR
【讨论】:
【参考方案4】:在跟进@Hisham Muneer 时,我将我的Activity 实例发送到我的班级并且它可以工作。runOnUiThread
是Activity
班级中的一个方法。这是最终代码:
public class MyLayout extends LinearLayout implements Runnable
int color = 0xFFFFFFFF;
Activity context;
public MyLayout(Activity context)
super(context);
this.context = context;
myView = this;
Thread t = new Thread(this);
t.start();
private View myView;
@Override
public void run()
try
while (true)
Thread.sleep(1000);
context.runOnUiThread(new Runnable()
@Override
public void run()
// TODO Auto-generated method stub
if (color == 0xFF000000)
color = 0xFFFFFFFF;
else
color = 0xFF000000;
myView.setBackgroundColor(color);
postInvalidate();
System.out.println("Color >> " + color);
);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
【讨论】:
以上是关于更改视图的背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章