안드로이드 스튜디오 viewmodel 질문
본문
지금 제가 개발중인 앱이 모든 화면이 프래그먼트로 구성되어 있고 로그인 화면에서 로그인 성공을 하면 viewmodel을 이용하여 다른 화면들에 아이디 값을 전부 공유하고 싶습니다.
구글링을 해서 코드를 나름 짜봐도 계속 오류가 발생하여 해결하지 못하고 있습니다.
로그인 페이지 코드입니다.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_login, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// binding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_login);
// binding = DataBindingUtil.bind(view);
// binding.setLifecycleOwner(requireActivity());
// binding.setViewModel(viewModel);
viewModel = ViewModelProviders.of(getActivity()).get(GetViewModel.class);
//입력한 값 얻어옴
editTextEmail = getActivity().findViewById(R.id.editTextLEmail);
editTextPwd = getActivity().findViewById(R.id.editTextLPwd);
//로그인 버튼 클릭
buttonOverlap = getActivity().findViewById(R.id.buttonOverlap);
buttonOverlap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//editText에 입력된 값을 가져옴
final String user_id = editTextEmail.getText().toString().trim();
final String user_pw = editTextPwd.getText().toString().trim();
if(user_id.isEmpty() || user_pw.isEmpty()){
Toast.makeText(getActivity(), "아이디와 비밀번호를 입력해주세요.", Toast.LENGTH_SHORT).show();
return;
}
Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
boolean success = jsonObject.getBoolean("success"); //(jsp에서 성공하면 response["success"] = true; 해준것을 받아옴)
if (success) { //로그인에 성공한 경우
String user_id = jsonObject.getString("user_id"); //서버로부터 유저 아이디, 패스워드 받음
String user_pw = jsonObject.getString("user_pw");
// Toast.makeText(getActivity(), "로그인 되었습니다.", Toast.LENGTH_SHORT).show();
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.action_loginFragment_to_MailboxNoticeFragment);
viewModel.getID(user_id);
// Bundle bundle = new Bundle();
// bundle.putString("user_id", user_id);
// NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.action_loginFragment_to_MailboxNoticeFragment, bundle);
} else{ //로그인에 실패한 경우
Toast.makeText(getActivity(), "아이디 또는 비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show();
return;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
LoginRequest loginRequest = new LoginRequest(user_id, user_pw, responseListener);
RequestQueue queue = Volley.newRequestQueue(getActivity());
queue.add(loginRequest);
}
});
//회원가입 버튼 클릭
buttonSignup = getActivity().findViewById(R.id.buttonSignup);
buttonSignup.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.action_loginFragment_to_signupFragment);
}
});
}
//앱바 죽이기
@Override
public void onResume() {
super.onResume();
((MainActivity)getActivity()).getSupportActionBar().hide();
}
}
로그인 후 이동하는 페이지입니다.
viewModel = ViewModelProviders.of(getActivity()).get(GetViewModel.class);
// binding = DataBindingUtil.bind(view);
// binding.setLifecycleOwner(requireActivity());
// binding.setViewModel(viewModel);
String id = viewModel.outID();
Toast.makeText(getActivity(), id+"값",Toast.LENGTH_LONG);
뷰모델 클래스 코드입니다.
import androidx.lifecycle.ViewModel;
public class GetViewModel extends ViewModel {
public String user_id = "hi";
public void getID(String id){
user_id = id;
}
public String outID(){
return user_id;
}
}
로그인 화면의 xml 코드입니다.
<data> <variable name="ViewModel" type="androidx.lifecycle.ViewModel"/> </data>
코드의 어떤 부분이 문제일까요? 정말 몇날 며칠을 고민해보고 찾아보고 시도해봐도 답이 나오지 않습니다. 살려주세요.
!-->!-->!-->!-->답변 1
https://re-build.tistory.com/37
https://yonoo88.tistory.com/1360
SharedPreferences
를 사용하시면 php 에서 세션처럼 모든 페이지에서 공유가 가능합니다.
답변을 작성하시기 전에 로그인 해주세요.