Java 从按钮活动外部定位按钮
大家好,我有一个Firebaselistener类,它监听值1。当达到此值时,我希望按钮可以更改。最初,我在我的主要活动中设置了所有这些,使用Java 从按钮活动外部定位按钮,java,android,button,Java,Android,Button,大家好,我有一个Firebaselistener类,它监听值1。当达到此值时,我希望按钮可以更改。最初,我在我的主要活动中设置了所有这些,使用 if(dls==1){ m.setBackground(getResources().getDrawable(R.drawable.buttonbkground2)); } 在我的主要活动中使用valueEventlistener并侦听值 但是现在我设置了一个类来做同样的事情,我无法从主活动访问按钮ID public class RewardValue
if(dls==1){
m.setBackground(getResources().getDrawable(R.drawable.buttonbkground2));
}
在我的主要活动中使用valueEventlistener并侦听值
但是现在我设置了一个类来做同样的事情,我无法从主活动访问按钮ID
public class RewardValueListener implements ValueEventListener {
FirebaseAuth mAuth;
String userid;
int i;
View view;
String dls;
Button mButton;
Context c;
public RewardValueListener() {
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
userid = user.getUid();
dls = dataSnapshot.child(userid).child("counter").getValue(String.class);
Log.d("tag", "Value: " + dls);
i = Integer.parseInt(dls);
if (i == 1) {
Log.d("tag", "Congrats " + i);
mButton.setBackground(c.getResources().getDrawable(R.drawable.buttonbkground2));
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
***代码编辑与板球答案包括在内
public void getButton(Button button,Context context) {
mButton = button;
c=context;
}
我知道这与调用视图有关,但如何调用它
谁能帮帮我,告诉我哪里出了问题谢谢
***编辑
好的,谢谢@cricket_007的回答,他的回答非常有效。现在我有了代码,可以调用我的Listener类来更改主活动中的所有按钮,而不仅仅是一个按钮
我可以让它工作,如果为每个按钮,如果这样写的代码,但有没有一种方法来压缩它,所以我不必溢出我的主要活动
RewardValueListener reward1 = new RewardValueListener();
mListref.child("RewardsSystem").addValueEventListener(reward1);
reward1.getButton(mstreaming,mcontext);
RewardValueListener reward2 = new RewardValueListener();
mListref.child("RewardsSystem").addValueEventListener(reward2);
reward2.getButton(mcustom,mcontext);
RewardValueListener reward3 = new RewardValueListener();
mListref.child("RewardsSystem").addValueEventListener(reward3);
reward3.getButton(mlauncher,mcontext);
RewardValueListener reward4 = new RewardValueListener();
mListref.child("RewardsSystem").addValueEventListener(reward4);
reward4.getButton(mmovies,mcontext);
ect ect....
您需要将按钮作为字段传递给侦听器,无论是在构造它时还是作为setter 这应该起作用:
public class RewardValueListener implements ValueEventListener {
FirebaseAuth mAuth;
String userid;
int i;
View view;
String dls;
Button button;
public RewardValueListener(Button button) {
this.button = button;
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
userid = user.getUid();
dls = dataSnapshot.child(userid).child("counter").getValue(String.class);
Log.d("tag", "test before if " + dls);
i = Integer.parseInt(dls);
if (i==1){
Log.d("tag", "test after if " + i);
button.setBackground(getResources().getDrawable(R.drawable.buttonbkground2));
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
只需添加到构造函数中
final Button mButton;
final Context mContext;
public RewardValueListener(Context context, Button button) {
mContext = context;
mButton = button;
}
并使用它代替按钮的findViewById
,以及mContext.getResources()
注意:当你创建这个类时,你需要有一个可用的按钮你有一个例子说明你所说的setter是什么意思吗请@MatthewEdited评论并回答。好的观点。你也需要通过抽签。看起来他接受了另一个答案。谢谢@MatthewBahr,但是蟋蟀更有意义,对不起,
视图是什么代码>用于?哈哈,这是代码我试过了,但它不起作用lol只是忘记了删除好吧,如果你保留它并正确使用,view.findViewById
将是一个选项,这就是为什么我要求用按钮代码定义一个函数,并从listenerused调用该函数正确吗?我刚试过view.findbyId,结果出错了。谢谢@cricket_007,效果不错。我如何重新喜欢getResources()我添加了视图,它使我的应用程序崩溃。我试着改变我按钮的文本,这样代码就正确了。我的观点有问题吗?我需要在什么地方初始化它吗?谢谢cricket,这对同一活动中的多个按钮@cricket\u 007也有效吗?如果你为每个按钮创建一个新的值侦听器,那么是的,在编辑时,child(“RewardsSystem”)
只能容纳一个侦听器,所以一次又一次地设置它是不正确的,但是你应该在一篇新的帖子中询问这一点