当前位置: 首页 > 知识库问答 >
问题:

为什么我不能在方法之外调用变量?[副本]

沈枫涟
2023-03-14

在这个解决方案中,我可以调用void中的变量。当我试图在void之外调用它时,数据是空的。

public class FormSendActivity extends AppCompatActivity {

// form edit text
EditText email ;
EditText perihal;
EditText deskripsi;

TextView tes;

// variabel untuk menyimpan data dari edit text menjadi string
public String emails;
public String perihals;
public String deskripsis;

//variabel untuk menampung datauser sesuai login
public String getnama;
public String getusername;

FirebaseAuth firebaseAuth;
public String uid ;

Button kirim;

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


    email = (EditText) findViewById(R.id.editText);
    perihal = (EditText) findViewById(R.id.editText2);
    deskripsi = (EditText) findViewById(R.id.editText4);
    kirim = (Button) findViewById(R.id.button);
    tes = (TextView) findViewById(R.id.textView3);

    firebaseAuth = firebaseAuth.getInstance();
    uid = firebaseAuth.getCurrentUser().getUid();

    dapatdatauser(uid);  // here i call the method of bottom, and put in to a variabel
    tes.setText(getusername); //  here i put the variabel to textview to test

    kirim.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            emails = email.getText().toString();
            perihals = perihal.getText().toString();
            deskripsis = deskripsi.getText().toString();

            Sendmail sendmail = new Sendmail(emails,perihals,deskripsis);
            FirebaseDatabase.getInstance().getReference("Sendmail")
                    .child(getusername).child("Outbox").push()
                    .setValue(sendmail).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()){
                        Toast.makeText(FormSendActivity.this,"Data sudah terkirim !!", Toast.LENGTH_SHORT).show();
                        Intent i = new Intent(FormSendActivity.this, MainActivity.class);
                        finish();
                    }else {
                        Toast.makeText(FormSendActivity.this,"Data gagal di kirim !!", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    });


}

public void dapatdatauser(String iduser){
    // Mendapatkan DataUsers Berdasarkan uid sesuai login
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    DatabaseReference query = reference.child("DataUsers").child(iduser);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            // Memasukkan data kedalam variabel username
            getusername = dataSnapshot.child("username").getValue(String.class);

        }

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

        }
    };
    query.addListenerForSingleValueEvent(valueEventListener);
}} 
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        // Memasukkan data kedalam variabel username
        getusername = dataSnapshot.child("username").getValue(String.class);

    }

但我只想知道,为什么我的代码一开始就不能工作?谢谢。

共有1个答案

佴英奕
2023-03-14

但是我只想知道,为什么我的代码中的第一个函数不是?

您无法获得getusername值,因为它是异步操作。数据尚未从数据库加载完毕,这就是无法访问的原因。

 类似资料:
  • 问题内容: 我有一类带有一些变量的类。当我在主类中实例化该类的对象时。我只能访问和修改一个方法(任何方法)中的成员变量;不在他们外面。这是为什么?我被困住了,似乎无法在Google上找到答案。 我也尝试访问说明符并得到相同的结果 问题答案: 它不起作用,因为您是在无效的Java语法的构造函数或方法之外定义实例的。 可能的解决办法是: 但是您可能要考虑保护您的类变量,例如使所有属性成为并使用和方法来

  • 作为一个初学者,我想知道为什么我的仅在放在主块内时有效? 当我有这样的代码时,我不能调用该方法。 方法调用类: 包含以下方法的类:

  • 我可以打印最大罚款,但我不能打印计数。我看不出max和count之间的区别,也看不出为什么它不让我打印count。感谢任何帮助

  • 我知道string1将包含一个空字符串。我的问题是为什么像下面这样两次调用nextLine方法会出现错误:

  • 今天在课堂上,我的老师告诉我,我不应该在python中使用全局变量,因为函数应该能够独立存在。我想我可以通过参数和返回值来实现这一点?任何帮助都会很好,谢谢。

  • 问题内容: 当我看到以下代码无法按预期工作时,我有些困惑。 我认为Java总是通过引用将变量传递给函数。因此,为什么函数不能重新分配变量? 该程序输出。 问题答案: 对对象的引用是通过Java中的 值 传递的,因此在方法内部分配给局部变量不会更改原始变量。仅局部变量指向新字符串。稍微了解一下ASCII艺术可能会更容易理解。 最初,您有: 首次输入方法setNotNull时,您 将在中 获得null