【问题标题】:Calling a Method From Within an onClick Listener从 onClick 侦听器中调用方法
【发布时间】:2020-06-13 05:02:05
【问题描述】:

我正在尝试从 setOnclickListener 中的 onClick 中调用“getVenueZipcode”。我希望会调用“getVenueZipcode”,并且会在“ZIPCODE =”+ zipcode 之前打印“zipcode[0] =” + zipcode[0]”。但是,事实并非如此。ZIPCODE = null 被打印,然后是 zipcode [0] = 12345 被打印出来。

这是 onClick 监听器的工作方式还是我遗漏了什么?

    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];
}

【问题讨论】:

  • 实现一个接口,一旦在 onDataChange 中分配了邮政编码,就会给你回调。
  • 感谢您的帮助和建议。不幸的是,我最终在代码中出现了许多错误和红色下划线区域。
  • 在单独的类中定义接口并使用代码。
  • 谢谢!我会进一步研究!

标签: java android methods onclick


【解决方案1】:

您必须实现一个接口,一旦您在 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) {
        }
    });
}

【讨论】:

    【解决方案2】:

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

    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) {
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多