Сохранение значений переменных в другом классе деятельности - PullRequest
0 голосов
/ 24 сентября 2019

В Android мне нужно отправлять значения переменных из одного класса активности в другой.Я знаю, что могу сделать это с помощью намерения.Но когда есть много значений переменных для отправки через несколько классов деятельности, это становится запутанным, особенно когда мне нужно изменить только несколько из них при переходе от одного класса деятельности к следующему.

Итак, я былрассматривая решение сохранить центральный суперкласс значений переменных, которые хранятся постоянно, и они могут обновляться из подклассов, когда я захочу.Navigation Drawer служит отличным кандидатом для суперкласса для этой цели, поскольку все мои классы активности Android наследуются от него.

public class ProductList extends NavigationDrawer
{
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        super.setTestVariable(9);
        ...
        Intent intent1 = new Intent(ProductList.this, ProductDetail.class);
        startActivity(intent1);
        finish();
        ...
    }
    ...
}

Теперь, почему этот класс не сохраняет значение переменной, а вместо этого сбрасывается в 0?Кто-нибудь знает, как заставить это работать?

public class ProductDetail extends NavigationDrawer
{
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        Toast.makeText(Context.this, "Test Variable: " + Integer.toString(super.getTestVariable()), Toast.LENGTH_LONG).show();
        ...
    }
    ...
}

Предположим, что Навигационный ящик работает как суперкласс, который действует как центральное хранилище для всех значений переменных, и все мои классы активности Android наследуются от него.Все классы действий обновляют значения глобальных переменных как центральное хранилище только в классе Navigation Drawer.

public class NavigationDrawer extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener
{
    ...
    int testVariable;

    public int getTestVariable() {
        return testVariable;
    }

    public void setTestVariable(int testVariable) {
        this.testVariable = testVariable;
    }
    ...
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

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

0 голосов
/ 24 сентября 2019

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

Что вы можете сделать, так это построить приложение на основе основного экземпляра приложения:

import android.app.Application;

public class YourOwnApplication extends Application {
    //...
    int testVariable;

    public int getTestVariable() {
        return testVariable;
    }

    public void setTestVariable(int testVariable) {
        this.testVariable = testVariable;
    }
}

Иобъявите свой класс приложения в манифесте:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.you.yourapp">

    <application
        android:name=".YourOwnApplication"

Затем вы можете получить доступ к переменной и установить ее значение из ваших действий:

int testVar = ((YourOwnApplication )getApplicationContext()).getTestVariable()
...