Как перекинуть данные с помощью shared preference на другое акивити

Мне нужно перенести данные которые я ввожу в EditText login && password. Cначала сохраняю данные с помощью buttonRegistr в первой Activity, и удаляю данные и когда жму login благодаря SharedPreference у меня данные автоматический вводятся и перебрасывают на SecondActivity . в SecondActivity у меня 2 EditText для login и password.

Мне нужно чтоб с MainActivity Edittext login & password перенесли в EditText SecondActivity. Вот мой код с MainActivity.

Напишите просто на Kotlin пожалуйста я новичок, я не знаю Java

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val Btnregistr = findViewById<Button>(R.id.Btnregistr)
    val Btnlog= findViewById<Button>(R.id.Btnlog)
    val EdtName = findViewById<EditText>(R.id.EdtName)
    val EDpas = findViewById<EditText>(R.id.EDpass)

    val preference = getSharedPreferences("Preference", Context.MODE_PRIVATE)

    btnRegistr.setOnClickListener {
        val text = edtName.text.toString()
        preference.edit().putString("text",text).apply()
        val text1 = eDpas.text.toString()
        preference.edit().putString("text1",text1).apply()

        Toast.makeText(applicationContext, "data is saved", Toast.LENGTH_LONG ).show()
    }

    Btnlog.setOnClickListener {

        val textFromPref =  preference.getString("text","not saved")

        EdtName.setText(textFromPref)

        val textFromProf =  preference.getString("text1","not saved")
        EDpas.setText(textFromProf )
       
        val intent = Intent(this, Profile::class.java )
        startActivity(intent)
    }

SecondActivity:

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_profile)

    val edtLogin = findViewById<EditText>(R.id.EdtLogin)
    val eDpass = findViewById<EditText>(R.id.EDpass)
    val update = findViewById<Button>(R.id.Update)
    val out = findViewById<Button>(R.id.Out)

    update.setOnClickListener {
        val pref = preference.getString()
    }

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Sergei Buvaka

Ну начнем с того, что передавать SharedPreference это немного не про то, чтоб передавать данные между активити.

SharedPreferences — постоянное хранилище на платформе Android, используемое приложениями для хранения своих настроек, например. Это хранилище является относительно постоянным, пользователь может зайти в настройки приложения и очистить данные приложения, тем самым очистив все данные в хранилище.

Теперь к вашему вопросы, как передать данные между активити. Если это простые данные (Примитивы, строки или не слишком большие объекты) то мы можем передать данные в другую активити с помощью Bundle.

Пример.

В отправляющей Activity:

public void sendData() {
    Intent intent = new Intent(this, SecondActivity.class); 
    intent.putExtra("fname", etFName.getText().toString());
    intent.putExtra("lname", etLName.getText().toString());
    startActivity(intent);
  } 

В принимающей Activity:

public class SecondActivity extends Activity {
   
  TextView tvView;
   
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);
     
    tvView = (TextView) findViewById(R.id.tvView);
     
    Intent intent = getIntent();
     
    String fName = intent.getStringExtra("fname");
    String lName = intent.getStringExtra("lname");
     
    tvView.setText("Your name is: " + fName + " " + lName);
  }
}

Более хорошей практикой является создавать статичный метод в вызываемой активити. Пример:

public class CallingActivity extends Activity {

    private static final String EXTRA_ACCOUNT_ID = "account_id";

    public static Intent createIntent(Context context, String accountId) {
        return new Intent(context, CallingActivity.class)
                .putExtra(EXTRA_ACCOUNT_ID, accountId);
    }
}

И вызывать это в вызывающей Activity:

startActivity(CallingActivity.createIntent(context, accountId))

Стоит помнить, что размер Bundle ограничен 1МВ, поэтому если вам необходимо передавать что-то более объемное, тут стоит задуматься о том, чтоб создать базу данных или же какое-то временное хранилище которое живет в течении всего приложения (Singleton - например). В этом случае вы можете к примеру через Bundle передать id вашего объекта (или любой другой идентификатор) и во втором Activity снова извлечь по этому id ваш объект.

Вот тут есть пример передачи данных между Activity.

Здесь документация по Bundle-ам.

P.S. Тоже самое на Kotlin:

fun sendData() {
    val intent = Intent(this, SecondActivity::class.java); 
    intent.putExtra("fname", etFName.getText().toString());
    intent.putExtra("lname", etLName.getText().toString());
    startActivity(intent);
  } 

class SecondActivity : Activity {

  override protected fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    val fName = intent.getStringExtra("fname");
    val lName = intent.getStringExtra("lname");

    tvView.text = "Your name is: $fName $lName"
  }
}

class CallingActivity : Activity {

    companion object {

        private const val EXTRA_ACCOUNT_ID = "account_id";

        fun createIntent(Context context, String accountId): Intent = 
            Intent(context, CallingActivity::class.java)
                    .putExtra(EXTRA_ACCOUNT_ID, accountId);
        
    }
}

P.P.S: если вы не знаете Java то вам нечего делать в Android. Хоть сейчас уже Google и заявил официально о том, что Kotlin основной язык Android-а, но во-первых: никто не отменял легаси, а во-вторых вся документация написана на Java. Да и просто гора основных классов написана на Java.

Если же вам все же кортит передавать через SharedPreference то вот здесь урок по тому как сделать это. Вот вам пример на Kotlin. Но я повторюсь, если вам просто надо передать строку между экранами, а не хранить ее у пользователя в памяти, то это плохое решение.

→ Ссылка