마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

액비티비 전환과 동시에 EditText 값 다른 액티비티로 보내기

0 추천

안녕하세요! NameActivity에서 EditText를 작성하고 버튼을 누르면, 화면이 LogInActivity로 전환됨과 동시에 EditText에 작성한 글이 UserActivity에 있는 TextView에 보여지는 코드를 작성하고 싶습니다.

아래 작성한 코드대로 실행할 경우, TextView에 보여지지 않아서... 해결 방법 알려 주시면 감사하겠습니다

 

NameActivity

public class NameActivity extends AppCompatActivity {

    private Button confirm;
    private EditText name;
    private TextView cat_name;

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

        name = findViewById(R.id.name);

        confirm = findViewById(R.id.confirm);
        confirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                SharedPreferences sharedPreferences = getSharedPreferences("Name", MODE_PRIVATE);   
                SharedPreferences.Editor editor = sharedPreferences.edit(); //sharedPreferences를 제어할 editor를 선언
                editor.putString("inputText", name.getText().toString()); // key,value 형식으로 저장
                editor.commit();

                Intent intent = new Intent(NameActivity.this, LogInActivity.class);
                startActivity(intent);
            }
        });
    }
}

 

activity_name.xml

<EditText
    android:id="@+id/name"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:inputType="text"
    android:maxLength="10"
    android:maxLines="1"
    android:orientation="vertical"
    android:textAlignment="center"
    android:textColor="@color/black"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"/>

<Button
    android:id="@+id/confirm"
    android:onClick="confirmBt"
    android:backgroundTint="@color/black"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="확인" />

 

UserActivity

public class UserActivity extends AppCompatActivity {

    ImageButton back;
    TextView cat_name;

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

        cat_name = findViewById(R.id.cat_name);

        SharedPreferences sharedPreferences = getSharedPreferences("Name", MODE_PRIVATE);
        String inputText = sharedPreferences.getString("Name", "");
        cat_name.setText(inputText);


        back = findViewById(R.id.back);
        back.setOnClickListener(v -> onBackPressed() );

    }
}

 

activity_user.xml

<TextView
    android:id="@+id/cat_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Name"
    android:textSize="30dp"
    android:textAlignment="center"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="400dp"/>
어쩔방구 (240 포인트) 님이 2022년 11월 24일 질문

1개의 답변

0 추천

LoginActivty가 아니라 UserActivity로 전환하는거 아닌가요? 액티비티를 한꺼번에 두개를 띄우는 건 좀 이상해 보이네요.
아니면 입력한 이름을 여러화면에 공유하고 싶은신건지, 질문이 명확하지 않네요.

UserActivity에 입력값을 넘긴다고 가정하고 말씀드릴게요. 다른 액티비티에 넘기는 것도 동일합니다.

SharedPreference에 입력값을 저장할 필요가 있는지 모르겠네요. 특별한 이유가 없다면 Intent에 입력값을 넘기세요.

public class NameActivity extends AppCompatActivity {

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        confirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  navigateToUserScreen(name.getText().toString());
            }
        });
    }

    private void navigateToUserScreen(String userName) {
         Intent intent = new Intent(NameActivity.this, LogInActivity.class);
         intent.putExtra(EXTRA_USER_NAME, userName);
         startActivity(intent);
    }
   
}

public class UserActivity extends AppCompatActivity {

    public static final String EXTRA_USER_NAME = "UserName";

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        String userName = getIntent().getStringExtra(EXTRA_USER_NAME, "");
        cat_name.setText(userName);


       ...

    }
}

 

혻 SharedPreferences를 사용한다면 아래처럼 하시면 됩니다.

public class AppSettings {
      private static final String PREFERENCE_NAME = "Name";
      private static final String KEY_USER_NAME = "UserName";
      
      private final SharedPreferences sharedPreferences;

      public AppSettings(Context context) [
           sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE_PRIVATE);   
      }

      public String getUserName() {
            return sharedPreferences.getString(KEY_USER_NAME, "");
     }
   
      public void setUserName(String value) {
          sharedPreferences.edit()
              .putString(KEY_USER_NAME, value);
              .apply();
      }
}

public class NameActivity extends AppCompatActivity {
    
    ...

    private AppSettings appSettings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        appSettings = new AppSettings(this);
        confirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  navigateToUserScreen(name.getText().toString());
            }
        });
    }

    private void navigateToUserScreen(String userName) {
         appSettings.setUserName(userName);
         Intent intent = new Intent(NameActivity.this, LogInActivity.class);
         startActivity(intent);
    }
   
}

public class UserActivity extends AppCompatActivity {

    ...
   
    private AppSettings appSettings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        appSettings = new AppSettings(this);
        String userName = appSettings.getUserName();
        cat_name.setText(userName);


       ...

    }
}

 

 

 

spark (224,800 포인트) 님이 2022년 11월 24일 답변
로그인 화면(LogInActivity)에서 회원가입 버튼을 누르면, 회원가입 화면(SignupActivity)이 뜨고

가입할 이메일과 비밀번호를 적고, 확인 버튼을 누르면 닉네임을 적을 수 있는 액티비티 (NameActivity)로 전환되게 했습니다.

NameActivity에서 EditText에 닉네임을 작성하고, 확인 버튼(confirm)을 누르면 다시 로그인 화면으로 돌아가서, 회원가입한 이메일과 비밀번호로 로그인하면 메인화면(MainActivity)으로 전환되게 했고

메인화면에서 UserActivity와 연결해둔 버튼을 누르면 NameActivity의 EditText에서 작성한 닉네임이 UserActivity TextView에 뜨게 구현하고 싶습니다!

제가 말을 제대로 못한 것 같네요 ㅠ 이해가 되실지 모르겠습니다...
로그인 처리를 별도의 서버에서 하지 않으시나요? 즉, 사용자 이름과 비밀번호를 검사하고, 로그인이 성공하면 엑세스토큰 같은 걸 발행하는 작업을 하는 서버가 없나요?
어쨋든, 님의 경우는 로그인이 성공할 경우에 SharePreference에 현재 로그인된 사용자 이름을 저장하시고 그걸 LoginActivity에서 불러오시면 됩니다. 제가 보여드린 두번째 방법과 차이가 없어요.

SignupActivity
- 확인버튼 클릭: 로그인 처리. 성공시에 SharedPreferences에 이메일, 비밀번호 저장. 키값을 "currentUserName" 이런 식으로 하면 어떤 사용자이름을 입력했는지 알 수 있겠죠.

NameActivity
- 저장버튼 클릭: SharedPreferences에 현재 사용자 닉네임을 업데이트.

LoginActivity
- onCreate 에서 SharedPreference에 현재 사용자 정보가 있는지 체크해서 있으면,
TextView에 표시
로그인 처리는 firebase에서 했습니다!

알려 주신 방법대로 해보는 중입니다. 정말 감사합니다!!
파이어베이스라면  FirebaseAuth 라이브러리가 있습니다. 이걸 사용하시는 것이 보안상도 그렇고 구현도 쉽습니다. FirebaseUi를 사용하시면 회원등록, 로그인 처리 등을 간단하게 구현할 수 있습니다.  아래 링크를 살펴보시면 유익한 정보가 많이 있습니다.
https://firebase.google.com/docs/auth/android/start
...