Почему «selectedCountry», «selectedAge», «selectedGender» возвращают ноль? - PullRequest
0 голосов
/ 07 июня 2019

Когда я запускаю свое приложение и перехожу к операции «EditProfile».И тогда я сразу же получу тостовое сообщение «Что-то не так», что означает, что переменные «selectedCountry», «selectedAge» и «selectedGender» равны нулю.

 public class EditProfile extends AppCompatActivity {

UserInfo userInfo;
UserInfo profileDetails;
Spinner spinnerFrom;
Spinner spinnerAge;
Spinner spinnerGender;
EditText hobbyEdit;
Button btnDone;
TextView textView;
String selectedCountry;
String selectedAge;
String selectedGender;

DatabaseHelper mydb = new DatabaseHelper(this, "MyUsers", null, 5);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_profile);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), Profile.class);
            intent.putExtra("id", userInfo.getId());
            intent.putExtra("username", userInfo.getUsername());
            startActivity(intent);
        }
    });

    Bundle extras = getIntent().getExtras();
    int id = extras.getInt("id");
    final String username = extras.getString("username");


    // Username
    userInfo = new UserInfo(id, username);
    textView = (TextView) findViewById(R.id.usernameUnedit);
    textView.setText(username);



    // Country
    spinnerFrom = (Spinner) findViewById(R.id.spinnerFrom);
    Locale[] locales = Locale.getAvailableLocales();
    final ArrayList<String> countries = new ArrayList<String>();
    countries.add("-");
    for (Locale locale : locales) {
        String country = locale.getDisplayCountry();
        if (country.trim().length() > 0 && !countries.contains(country)) {
            countries.add(country);
        }
    }

    Collections.sort(countries);

    ArrayAdapter<String> countryAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, countries);

    countryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerFrom.setAdapter(countryAdapter);
    spinnerFrom.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedCountry = parent.getItemAtPosition(position).toString();

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });



    // Age
    spinnerAge = (Spinner) findViewById(R.id.spinnerAge);
    final ArrayList<String> ages = new ArrayList<String>();
    ages.add("-");
    for (int i = 18; i < 100; i++) {
        ages.add(String.valueOf(i));
    }

    ArrayAdapter<String> ageAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ages);
    ageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerAge.setAdapter(ageAdapter);
    spinnerAge.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedAge = parent.getItemAtPosition(position).toString();

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });



    // Gender
    spinnerGender = (Spinner) findViewById(R.id.spinnerGender);
    final ArrayList<String> genders = new ArrayList<String>();
    genders.add("-");
    genders.add("Male ♂");
    genders.add("Female ♀");
    genders.add("Other");

    ArrayAdapter<String> genderAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, genders);
    genderAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerGender.setAdapter(genderAdapter);
    spinnerGender.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedGender = parent.getItemAtPosition(position).toString();

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });



    // Hobby
    hobbyEdit = (EditText) findViewById(R.id.hobbyEdit);



    // Button done
    btnDone = (Button) findViewById(R.id.btnDone);
    btnDone.setEnabled(false);

/* Stuck at this if statement below */
    if (selectedCountry != null && selectedAge != null && selectedGender != null) {
        if (!mydb.isStoredProfileDetails(username, selectedCountry, selectedAge, selectedGender, hobbyEdit.getText().toString())) {
            btnDone.setEnabled(true);
            btnDone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    profileDetails = new UserInfo(selectedCountry, selectedAge, selectedGender, hobbyEdit.getText().toString());
                    mydb.updateTable(username, profileDetails);

                }
            });
        } else {
            Toast.makeText(this, "Something is wrong 2.", Toast.LENGTH_LONG).show();
        }
    } else {
        Toast.makeText(this, "Something is wrong.", Toast.LENGTH_LONG).show();
    }
}
}

Я ожидаю, что после выбораэлемент из этих 3 выпадающих списков (счетчики) и значения выбранных элементов не существуют в базе данных, тогда кнопка «Готово» будет кликабельной.После нажатия кнопки она сохранит выбранные значения из выпадающих списков (счетчиков) в базу данных, обновив ее.

К сожалению, я застрял в операторе if, как указано в данном коде, поскольку он продолжает возвращатьсяоператор "else".

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

Вы должны проверить оба условия в Spinner's OnItemSelectedListener. Если оба условия вернут истину, то включите вашу кнопку. и вызовите setonClickListener для кнопки в onCreateView, как это.

 spinnerGender.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedGender = parent.getItemAtPosition(position).toString();
            //Conditions to enable button
            if (selectedCountry != null && selectedAge != null && selectedGender != null) {
            if (!mydb.isStoredProfileDetails(username, selectedCountry, selectedAge, selectedGender, hobbyEdit.getText().toString())) {
                btnDone.setEnabled(true);
            }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

добавить эти строки во все счетчики.

0 голосов
/ 07 июня 2019

В вашем методе onCreate вы создали экземпляры представлений и подключили к ним слушателей.Это прекрасно.Однако это не означает, что логика в этих слушателях будет выполняться одновременно и в порядке.Вы только что определили поведение слушателей.После всей этой инициализации ваш код напрямую проверяет значения трех строк, упомянутых в вашем вопросе.Он не ждет, когда пользователь будет взаимодействовать со счетчиками.

Вам нужно вызвать изменение в кнопке «Готово», когда пользователь выбирает что-либо из счетчика.Таким образом, логика установки строк и, следовательно, проверки, можно ли включить кнопку «Готово», должна идти в слушателях счетчиков.

Я не даю вам прямого решения кода проблемы, но подходкоторый вы могли бы использовать.

0 голосов
/ 07 июня 2019

Установите вашу переменную как ...

String selectedCountry = "";
String selectedAge = "";
String selectedGender = "";

И проверить состояние как ...

if (!selectedCountry.equals("") && !selectedAge.equals("") && !selectedGender.equals("")) {
//your code goes here
}
...