从onClick侦听器中调用方法

时间:2020-02-29 07:03:05

标签: java android methods onclick

我正在尝试从setOnclickListener内的onClick调用“ getVenueZipcode”。我希望将调用“ getVenueZipcode”,并在“ ZIPCODE =” +邮政编码之前打印“ zipcode [0] =“ + zipcode [0]”。但是,实际情况并非如此。先打印ZIPCODE = null,然后再进行邮政编码[0] = 12345已打印。

这是onClick Listener的工作方式还是我缺少什么?

    mAdd_gigEvent_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            gigEvent = new GigEvent();

            mBand_name_editText = findViewById(R.id.add_band_name_editText);
            mVenue_name_editText = findViewById(R.id.add_venue_name_editText);
            mDate_editText = findViewById(R.id.add_date_editText);
            mTime_editText = findViewById(R.id.add_time_editText);

            String venue_name = mVenue_name_editText.getText().toString();
            String zipcode = getVenueZipcode(venue_name);

            System.out.println("ZIPCODE = " + zipcode);

            gigEvent.setGigAuth(userID);
            gigEvent.setBand(mBand_name_editText.getText().toString());
            gigEvent.setVenue(mVenue_name_editText.getText().toString());
            gigEvent.setDate(mDate_editText.getText().toString());
            gigEvent.setTime(mTime_editText.getText().toString());
            gigEvent.setZipcode(zipcode);

            mDatabase.child(userID).setValue(gigEvent);

            Toast.makeText(AddGigEvent.this, "Gig/Event added!",
                    Toast.LENGTH_LONG).show();

            startActivity(new Intent(AddGigEvent.this, Search.class));
        }
    });
}


public String getVenueZipcode(String name) {
    final Query venue_query;
    final String v_name = name;
    final String[] zipcode = new String[1];

    DatabaseReference mDatabase =
            FirebaseDatabase.getInstance().getReference().child("venues");
    venue_query = mDatabase.orderByChild("uid");
    venue_query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                if(snapshot.child("name").getValue().toString().equals(v_name)) {
                    zipcode[0] = snapshot.child("venue_zipcode").getValue().toString();

                    System.out.println("zipcode[0] = " + zipcode[0]);

                    return;
                }
            }
        }

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

    return zipcode[0];
}

2 个答案:

答案 0 :(得分:0)

您将必须实现一个接口,一旦在FirebaseDatabase上获得邮政编码,该接口将为您提供回调。

您可以这样做:

interface ReceiveZipCodeListener {
    public void onZipCodeReceived(String zipCode);
}

mAdd_gigEvent_btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        gigEvent = new GigEvent();

        mBand_name_editText = findViewById(R.id.add_band_name_editText);
        mVenue_name_editText = findViewById(R.id.add_venue_name_editText);
        mDate_editText = findViewById(R.id.add_date_editText);
        mTime_editText = findViewById(R.id.add_time_editText);

        String venue_name = mVenue_name_editText.getText().toString();
        getVenueZipcode(venue_name, new ReceiveZipCodeListener({
            @Override
            public void onZipCodeReceived(String zipCode) {
                System.out.println("ZIPCODE = " + zipcode);

                gigEvent.setGigAuth(userID);
                gigEvent.setBand(mBand_name_editText.getText().toString());
                gigEvent.setVenue(mVenue_name_editText.getText().toString());
                gigEvent.setDate(mDate_editText.getText().toString());
                gigEvent.setTime(mTime_editText.getText().toString());
                gigEvent.setZipcode(zipcode);

                mDatabase.child(userID).setValue(gigEvent);

                Toast.makeText(AddGigEvent.this, "Gig/Event added!",
                        Toast.LENGTH_LONG).show();

                startActivity(new Intent(AddGigEvent.this, Search.class));
            }
        }));    
    }
});

public void getVenueZipcode(String name, ReceiveZipCodeListener listener) {
    final Query venue_query;
    final String v_name = name;

    DatabaseReference mDatabase =
        FirebaseDatabase.getInstance().getReference().child("venues");
    venue_query = mDatabase.orderByChild("uid");
    venue_query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                if(snapshot.child("name").getValue().toString().equals(v_name)) {
                    String zipCode = snapshot.child("venue_zipcode").getValue().toString();

                    System.out.println("zipcode = " + zipCode);

                    listener.onZipCodeReceived(zipCode);
                }
            }
        }

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

答案 1 :(得分:0)

这是对我有用的解决方案:

FirebaseUser fBUser = mAuth.getCurrentUser();
final String userID = fBUser.getUid();

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

    actionBar = getSupportActionBar();
    actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#FF0367BE")));

    mAdd_gigEvent_btn = findViewById(R.id.add_gigEvent_btn);
    mAdd_gigEvent_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            beenClicked();
        }
    });
}

public void beenClicked() {
    mDatabase = FirebaseDatabase.getInstance().getReference().child("gigevents");

    gigEvent = new GigEvent();

    mBand_name_editText = findViewById(R.id.add_band_name_editText);
    mVenue_name_editText = findViewById(R.id.add_venue_name_editText);
    mDate_editText = findViewById(R.id.add_date_editText);
    mTime_editText = findViewById(R.id.add_time_editText);

    String venue_name = mVenue_name_editText.getText().toString();
    getVenueZipcode(venue_name);

    Toast.makeText(AddGigEvent.this, "Gig/Event added!",
            Toast.LENGTH_LONG).show();

    startActivity(new Intent(AddGigEvent.this, Search.class));
}

public void getVenueZipcode(String name) {
    final Query venue_query;
    final String v_name = name;
    final String[] zipcode = new String[1];

    final DatabaseReference mVenueDatabase =
            FirebaseDatabase.getInstance().getReference().child("venues");
    venue_query = mVenueDatabase.orderByChild("uid");
    venue_query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                if(snapshot.child("name").getValue().toString().equals(v_name)) {
                    zipcode[0] = snapshot.child("venue_zipcode").getValue().toString();

                    System.out.println("zipcode[0] = " + zipcode[0]);

                    gigEvent.setGigAuth(userID);
                    gigEvent.setBand(mBand_name_editText.getText().toString());
                    gigEvent.setVenue(mVenue_name_editText.getText().toString());
                    gigEvent.setDate(mDate_editText.getText().toString());
                    gigEvent.setTime(mTime_editText.getText().toString());
                    gigEvent.setZipcode(zipcode[0]);

                    mDatabase.child(userID).setValue(gigEvent);

                    return;
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });
}
相关问题