如何根据Firebase中存储的数据更改按钮的文本颜色

时间:2019-12-16 15:01:41

标签: android firebase-realtime-database

我目前正在使用Firebase在Android停车系统上做项目。

enter image description here

这是我的输出,显示了停车场中的插槽。

此输出中的每个按钮代表很多插槽。这些按钮是根据数据库中每个批次存储的“插槽数”(AllSlot集合中的SlotNo4)动态创建的。

如果插槽“可用”(我在数据库中为每个插槽提供(AllSlot集合中的SStatus)),我希望这些按钮的文本颜色为黑色,如果插槽已被“占用”,则这些颜色为红色。车辆,并且如果插槽“已预订”,则处于黄色。

但是我无法确定..正如您在输出中看到的那样,只有'S5'显示为黄色..其余的插槽(按钮)文本颜色没有更改..请帮助我

enter image description here

这是我的Firebase数据库集合(AllSlot),用于显示插槽详细信息。

enter image description here

数据库屏幕截图继续

这是我的代码。

public class SlotActivity extends AppCompatActivity implements View.OnClickListener {

    LinearLayout parent1, parent2, parent3, parent4;
    Button b;
    String m = Prevalent1.currentsearchslot.getSlotNo4();
    int n = Integer.parseInt(m);
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("AllSlot").
            child(Prevalent1.currentsearchslot.getLID());




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slot);

        parent1 = (LinearLayout) findViewById(R.id.ll_parent);
        parent2 = (LinearLayout) findViewById(R.id.ll_parent2);
        parent3 = (LinearLayout) findViewById(R.id.ll_parent3);
        parent4 = (LinearLayout) findViewById(R.id.ll_parent4);


        for (int i = 0; i < n / 4; i++) {
            b = new Button(SlotActivity.this);
            b.setId(i + 1);
            b.setText("S" + (i + 1));
            slotdb(b.getId());
            parent1.addView(b);
            b.setOnClickListener(SlotActivity.this);

        }

        for (int i = n / 4; i < n / 2; i++) {
            b = new Button(SlotActivity.this);
            b.setId(i + 1);
            b.setText("S" + (i + 1));
            slotdb(b.getId());
            parent2.addView(b);
            b.setOnClickListener(SlotActivity.this);

        }
        for (int i = n / 2; i < 3 * n / 4; i++) {
            b = new Button(SlotActivity.this);
            b.setId(i + 1);
            b.setText("S" + (i + 1));
            slotdb(b.getId());
            parent3.addView(b);
            b.setOnClickListener(SlotActivity.this);

        }

        for (int i = 3 * n / 4; i < n; i++) {
            b = new Button(SlotActivity.this);
            b.setId(i + 1);
            b.setText("S" + (i + 1));
            slotdb(b.getId());
            parent4.addView(b);
            b.setOnClickListener(SlotActivity.this);

        }

    }




    private void slotdb(final int id) {

        final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("AllSlot").
                child(Prevalent1.currentsearchslot.getLID());

         final String sid = String.valueOf(id);

        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (!(dataSnapshot.child(sid).exists())) {

                    HashMap<String, Object> userdataMap = new HashMap<>();
                    userdataMap.put("SID", sid);
                    userdataMap.put("SStatus", "Available");

                    ref.child(sid).updateChildren(userdataMap);

                } else {

                    if (dataSnapshot.child(sid).child("SStatus").exists()) {

                        if ((dataSnapshot.child(sid).child("SStatus")).getValue().equals("Occupied")) {


                            b.setTextColor(Color.RED);


                        } else if ((dataSnapshot.child(sid).child("SStatus")).getValue().equals("Booked")) {

                            b.setTextColor(Color.YELLOW);

                        } else {

                            b.setTextColor(Color.BLACK);

                        }
                    }

                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }



    @Override
    public void onClick(final View view) {

        view.getId();
        final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("AllSlot").
                child(Prevalent1.currentsearchslot.getLID());
        final int a = view.getId();


        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.child(String.valueOf(a)).exists()) {

                    SingleSlot data = dataSnapshot.child(String.valueOf(a)).getValue(SingleSlot.class);

                    if (data.getSID().equals(String.valueOf(a))) {

                        Prevalent2.currentclickedslot = data;


                        if (Prevalent2.currentclickedslot.getSStatus().equals("Available")) {
                            Toast.makeText(getApplicationContext(), "Available!!", Toast.LENGTH_SHORT).show();


                            Intent intent = new Intent(SlotActivity.this, BookInfo.class);
                            startActivity(intent);

                        } else if (Prevalent2.currentclickedslot.getSStatus().equals("Occupied")) {
                            Toast.makeText(getApplicationContext(), "Occupied!!", Toast.LENGTH_SHORT).show();

                        } else {
                            Toast.makeText(getApplicationContext(), "This Slot is already Booked!!", Toast.LENGTH_SHORT).show();


                        }


                    }

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }
}

1 个答案:

答案 0 :(得分:0)

编写类似以下内容的方法:

private void changeTextColor(LinearLayout layout, int color) {
for (int i = 0; i < layout.getChildCount(); i++) {
    View v = layout.getChildAt(i);
    if (v instanceof Button) {
        v.setTextColor(color);
    }
 }
}

并为所有父级布局调用它,为什么您的方法不起作用,因为u具有全局变量b,并且每次每次都为其分配一个新按钮并丢失旧引用。