Как отобразить данные из одного вида деятельности в другое и одновременно сохранить их? - PullRequest
0 голосов
/ 03 января 2019

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

У меня есть два действия.

  1. Activity one-> Я сохраняю дату с помощью SharedPraferences в переменной NAME_RESTAURANT и отправляю метод метки даты 'getMsg ()'

  2. Activity two -> Я получаю дату и хочу поставитьэто в TextView с именем etWelcomeToRestaurant2

Дата представлена ​​строкой, которую я получаю из EditText с именем etDRestaurantName в первом действии.

Моя проблемав том, что в SecondActivity дата не отображается.

действие, в котором я сохраняю дату, и из которого я передаю дату в Другое действие

public class AdminAreaActivity extends AppCompatActivity {

        public static final String SHARED_PREFS = "sharedPrefs";
        public static final String RESTAURANT_NAME = "restaurantName";

        private String NAME_RESTAURANT;
        private EditText etDRestaurantName;


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


            etDRestaurantName = findViewById(R.id.etRestaurantName);
            final Button bRestaurantChange = findViewById(R.id.bRestaurantChange);

            bRestaurantChange.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(!etDRestaurantName.getText().toString().matches("")){
                        Intent mainIntent = new Intent(AdminAreaActivity.this,MainActivity.class);
                        saveData();
                        loadData();
                        etDRestaurantName.getText().clear();
                        startActivity(mainIntent);
                    }
                    else
                    {
                        AlertDialog.Builder builder = new AlertDialog.Builder(AdminAreaActivity.this);
                        builder.setMessage("Failed!")
                                .setNegativeButton("Retry", null)
                                .create()
                                .show();
                    }
                }
            });



        }



        public void saveData(){
            SharedPreferences sharedPreferences =getSharedPreferences(SHARED_PREFS,MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();

            editor.putString(RESTAURANT_NAME,etDRestaurantName.getText().toString()+"!");
            editor.apply();
            Toast.makeText(this,"Data saved!",Toast.LENGTH_SHORT);

        }

        public void loadData(){
            SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS,MODE_PRIVATE);
            NAME_RESTAURANT = sharedPreferences.getString(RESTAURANT_NAME,"Your Restaurant here!");
        }

        public  String getMsg(){
           return NAME_RESTAURANT;

        }



    }

действие, в которое я хочуположить данные и где я их получил:

public class MainActivity extends AppCompatActivity {

    private TextView etWelcomeToRestaurant2;

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

        final TextView etWelcomeToRestaurant = findViewById(R.id.etWelcomeToRestaurant);
        String messg = "Welcome to,\n";
        etWelcomeToRestaurant.setText(messg);

        etWelcomeToRestaurant2 = findViewById(R.id.etWelcomeToRestaurant2);

        AdminAreaActivity admOBj = new AdminAreaActivity();
        etWelcomeToRestaurant2.setText(((AdminAreaActivity)admOBj).getMsg());

    }


}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

SharedPreferences может быть неправильным способом хранения данных, потому что «он использует дорогие операции, которые могут замедлить работу приложения».Взгляните на Комната для хранения.

Чтобы ответить на ваш вопрос:

  1. Удалите метод loadData () и его выполнение из вашей AdminAreaActivity, так как вы хотитезагрузить данные в вашей MainActivity.Кроме того, вы назвали неправильное имя SharedPreference (NAME_RESTAURANT).
  2. Пишите только константы с заглавными буквами
  3. Вы можете редактировать свои saveData () и loadData (), чтобы использовать их позже

См. Мое исправление ниже

AdminAreaActivity

 public class AdminAreaActivity extends AppCompatActivity {
    public static final String SHARED_PREFS = "sharedPrefs";
    public static final String RESTAURANT_NAME = "restaurantName";

    private EditText etDRestaurantName;

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

        etDRestaurantName = findViewById(R.id.etRestaurantName);
        final Button bRestaurantChange = findViewById(R.id.bRestaurantChange);

        bRestaurantChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!etDRestaurantName.getText().toString().matches("")) {
                    Intent mainIntent = new Intent(AdminAreaActivity.this, MainActivity.class);
                    saveData(RESTAURANT_NAME, etDRestaurantName.getText().toString() + "!");
                    etDRestaurantName.getText().clear();
                    startActivity(mainIntent);
                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(AdminAreaActivity.this);
                    builder.setMessage("Failed!").setNegativeButton("Retry", null).create().show();
                }
            }
        });

    }

    public void saveData(String prefName, String prefValue) {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.putString(prefName, prefValue);
        editor.apply();
        Toast.makeText(this, "Data saved!", Toast.LENGTH_SHORT);

    }
}

MainActivity

public class MainActivity extends AppCompatActivity {

    private TextView etWelcomeToRestaurant2;

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

        final TextView etWelcomeToRestaurant = findViewById(R.id.etWelcomeToRestaurant);
        String messg = "Welcome to,\n";
        etWelcomeToRestaurant.setText(messg);

        etWelcomeToRestaurant2 = findViewById(R.id.etWelcomeToRestaurant2);
        etWelcomeToRestaurant2.setText(loadData(AdminAreaActivity.RESTAURANT_NAME, "Your Restaurant here!"));

    }

    public String loadData(String prefName, String defValue){
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS,MODE_PRIVATE);
        return sharedPreferences.getString(prefName, defValue);
    }
}
0 голосов
/ 04 января 2019

В Android вам никогда не следует использовать оператор new с классом Activity.

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

Еще лучше, создайте вспомогательный класс для управления настройками.Назовите это как PreferenceHelper, и это будет выглядеть примерно так:

public class PreferenceHelper {

    public static final String SHARED_PREFS = "sharedPrefs";
    public static final String RESTAURANT_NAME = "restaurantName";

    public static String getResturantName(Context context) {
        return context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).getString(RESTAURANT_NAME,"Your Restaurant here!");
    }

    public static void setResturantName(Context, String name) {
        context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).edit().putString(RESTAURANT_NAME, name).apply();
    }
}

Теперь вы можете вызывать своего помощника из обоих классов.

...