dataSnapshot должен быть объявлен окончательным - PullRequest
0 голосов
/ 02 февраля 2019

Я использую переменную в классе, но получаю ошибку:

Переменная dataSnapshot доступна из внутреннего класса, должна быть объявлена ​​как final

Я знаю, что мне нужноиспользуйте final, если я использую внутри onCreateView, но я не использую.Так почему я получаю эту ошибку?

Я получаю эту ошибку только в событии setOnClickListener.

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.util.Log;


import com.google.firebase.auth.FirebaseAuth;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.auth.FirebaseUser;

import java.util.Locale;

public class Show extends Fragment {



    //private FirebaseAuth user;
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference();



    String credit;
    String current;
    String values;
    String odds;


    TextView tv1odds;
    TextView tv1values;
    TextView currentcredit;

    LinearLayout tv1kilit;



    public Show() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View Gview = inflater.inflate(R.layout.fragment_blank_fragment2, container, false);




         tv1kilit = (LinearLayout)Gview.findViewById(R.id.Tvalue1kilit);




        try {
            myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange( DataSnapshot dataSnapshot) {

                        if (dataSnapshot.child("tutka").getValue().equals("Yes")) {
                        Log.d("ERR", "OK");

                        }else{
                        Log.d("ERR", "NOPE");

                        }



                            current = dataSnapshot.child("Users").child(user.getUid()).child("credit").getValue().toString();
                            currentcredit.setText(getResources().getString(R.string.credit) + " " + current);




                            tv1kilit.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    int eksilt = Integer.parseInt(credit); 
                                    int kullanıcıBakiyesi = Integer.parseInt(dataSnapshot.child("Users").child(user.getUid()).child("credit").getValue().toString());
                                    int kalan = kullanıcıBakiyesi - eksilt;

                                    if (kalan >= 0 && tv1values.getText().subSequence(0, 2).equals("Cr") && !Locale.getDefault().getDisplayLanguage().equals("Türkçe") && !dataSnapshot.child("Users").child(user.getUid()).child("Tvalue1").getValue().equals(dataSnapshot.child("Tvalue1").child("Oynayanlar").getValue().toString())) {
                                        myRef.child("Users").child(user.getUid()).child("credit").setValue(Integer.toString(kalan)); //kullanıcı creditsi
                                        tv1values.setText(values);
                                        tv1odds.setText(odds);
                                        myRef.child("Users").child(user.getUid()).child("Tvalue1").setValue(dataSnapshot.child("Tvalue1").child("Oynayanlar").getValue().toString());
                                        String koy = dataSnapshot.child("Tvalue1").child("Oynayanlar").getValue().toString();
                                        myRef.child("Users").child(user.getUid()).child("Tvalue1").setValue(koy);
                                    } else if (kalan >= 0 && tv1values.getText().subSequence(0, 2).equals("Kr") && Locale.getDefault().getDisplayLanguage().equals("Türkçe") && !dataSnapshot.child("Users").child(user.getUid()).child("Tvalue1").getValue().equals(dataSnapshot.child("Tvalue1").child("Oynayanlar").getValue().toString())) {
                                        myRef.child("Users").child(user.getUid()).child("credit").setValue(Integer.toString(kalan)); //kullanıcı creditsi
                                        tv1values.setText(values);
                                        tv1odds.setText(odds);
                                        myRef.child("Users").child(user.getUid()).child("Tvalue1").setValue(dataSnapshot.child("Tvalue1").child("Oynayanlar").getValue().toString());
                                        String koy = dataSnapshot.child("Tvalue1").child("Oynayanlar").getValue().toString();
                                        myRef.child("Users").child(user.getUid()).child("Tvalue1").setValue(koy);

                                    } else if (kalan < 0) {
                                        //Toast.makeText(getApplicationContext(), getResources().getString(R.string.errenoughtcredit), Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });









                }
                @Override
                public void onCancelled(DatabaseError error) {
                }
            });

        } catch (Exception e) {

            //Toast.makeText(this.getActivity(), R.string.errenoughtcredit, Toast.LENGTH_LONG).show();
        }





        return Gview;
    }

}

1 Ответ

0 голосов
/ 02 февраля 2019

Вы используете

dataSnapshot 

внутри метода

onClick 

внутри анонимного внутреннего класса, созданного с помощью

new View.OnClickListener()  

Любая локальная переменная, используемая внутри анонимноговнутренний класс должен быть объявлен как final, потому что компилятор создает поле в этом классе для хранения ссылки на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...