以编程方式访问菜单项以更改文本颜色



当用户单击菜单中的项目时,onOptionsItemSelected触发传递MenuItem作为参数。 这个传递MenuItem扩展了TextView,与我们从menu.findItem()方法中获得的不一样。 要访问此用户需要单击该项目,我想访问此对象而无需用户单击菜单中的项目。

在恢复中,只需调用 findViewById 并将其强制转换为 TextView。 您需要在 Timer 中执行此操作以延迟代码,直到视图变红,因为它由菜单呈现。 对我来说,它是这样工作的

if (!created) { // for first resume only
created = true;
Timer t = new Timer();
t.schedule(new TimerTask() { // Might be done in better way, dont  know yet
@Override
public void run() {
try {
while true {
final Object o = findViewById(R.id.mServerTime);
if (o == null) {
try {
Thread.sleep(1000);
} catch (Exception exp) {
}
} else {
if (o != null && o instanceof TextView) {
runOnUiThread(new Runnable() {
@Override
public void run() {
((TextView) o).setTextColor(Color.WHITE);
}
});
}
break;
}
}
}catch (Exception exp) {}
}
},1000);

我无法在上面的答案中发表评论,所以我正在写另一个答案。了解视图何时实际放置在屏幕上的更可靠方法是观察它的ViewTreeObserver,例如:

public class ActivityMain extends Activity {
// Instance variables
OnLayoutReadyListener onLayoutReadyListener = new OnLayoutReadyListener();
View v;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v = findViewById(R.id.mServerTime);
v.getViewTreeObserver().addOnGlobalLayoutListener(onLayoutReadyListener);
}
class OnLayoutReadyListener implements ViewTreeObserver.OnGlobalLayoutListener {
@Override
public void onGlobalLayout() {
// this will be called once view V is placed and measured on the screen
v.setTextColor(Color.WHITE);
// remove this listener to prevent any additional callbacks
v.getViewTreeObserver().removeOnGlobalLayoutListener(onLayoutReadyListener);
}
}
}

最新更新