2017-01-05 2 views
0

У меня есть класс LoginFragment() и класс ProfileFragment(), который реализован в NavigationDrawerActivity.Android SharedPreferences от Fragment to Activity

После входа в систему LoginFragment(), NavigationDrawerActivity. Когда я нажимаю «Настройки» в «Активность навигационного ящика», есть ProfileFragment, где я могу изменить пароль пользователя или выйти из системы.

У меня возникла проблема с загрузкой пользовательских данных в ProfileFragment от LoginFragment.

Редактор SharedPreferences, но он не содержит моих настроек USER.

Мой код процесса регистрации в LoginFragment():

import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.design.widget.Snackbar; 
import android.support.v7.widget.AppCompatButton; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.ProgressBar; 
import android.widget.TextView; 


import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class LoginFragment extends Fragment implements View.OnClickListener { 

    private AppCompatButton btn_login; 
    private EditText et_email,et_password; 
    private TextView tv_register; 
    private ProgressBar progress; 
    private SharedPreferences pref; 
    private SharedPreferences.Editor editor; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_login,container,false); 
     initViews(view); 
     return view; 
    } 

    private void initViews(View view){ 

     pref = getActivity().getPreferences(0); 

     btn_login = (AppCompatButton)view.findViewById(R.id.btn_login); 
     tv_register = (TextView)view.findViewById(R.id.tv_register); 
     et_email = (EditText)view.findViewById(R.id.et_email); 
     et_password = (EditText)view.findViewById(R.id.et_password); 

     progress = (ProgressBar)view.findViewById(R.id.progress); 

     btn_login.setOnClickListener(this); 
     tv_register.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()){ 

      case R.id.tv_register: 
       goToRegister(); 
       break; 

      case R.id.btn_login: 
       String email = et_email.getText().toString(); 
       String password = et_password.getText().toString(); 

       if(!email.isEmpty() && !password.isEmpty()) { 

        progress.setVisibility(View.VISIBLE); 
        loginProcess(email, password); 

       } else { 
        Snackbar.make(getView(), "Uzupełnij pola!", Snackbar.LENGTH_LONG).show(); 
       } 
       break; 

     } 
    } 
    private void loginProcess(String email,String password){ 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setEmail(email); 
     user.setPassword(password); 
     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.LOGIN_OPERATION); 
     request.setUser(user); 
     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       if(resp.getResult().equals(Constants.SUCCESS)){ 
        editor = pref.edit(); 
        editor.putBoolean(Constants.IS_LOGGED_IN,true); 
        editor.putString(Constants.EMAIL,resp.getUser().getEmail()); 
        editor.putString(Constants.NAME,resp.getUser().getName()); 
        editor.putString(Constants.UNIQUE_ID,resp.getUser().getUnique_id()); 
        editor.apply(); 
        goToProfile(); 

       } 
       progress.setVisibility(View.INVISIBLE); 
      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 

       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG,"failed"); 
       Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 

      } 
     }); 
    } 

    private void goToRegister(){ 

     Fragment register = new RegisterFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_frame,register); 
     ft.commit(); 
    } 

    private void goToProfile(){ 
//  Fragment profile = new ProfileFragment(); 
//  FragmentTransaction ft = getFragmentManager().beginTransaction(); 
//  ft.replace(R.id.fragment_frame,profile); 
//  ft.commit(); 
     startActivity(new Intent(getActivity(), MainActivity.class)); 
    } 
} 

Некоторые из ProfileFragment() классы:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

    pref = LoginFragment().pref; 
    //pref = getActivity().getPreferences(0); 
    SharedPreferences.Editor editor = LoginFragment().editor; 
    tv_name.setText("Welcome : "+pref.getString(Constants.NAME,"")); 
    tv_email.setText(pref.getString(Constants.EMAIL,"")); 

} 

И:

private void logout() { 
    SharedPreferences.Editor editor = pref.edit(); 
    editor.putBoolean(Constants.IS_LOGGED_IN,false); 
    editor.putString(Constants.EMAIL,""); 
    editor.putString(Constants.NAME,""); 
    editor.putString(Constants.UNIQUE_ID,""); 
    editor.apply(); 
    startActivity(new Intent(getContext(), LoginActivity.class)); 
} 

Как решить это интегрируют один SharedPreferences с другим? Спасибо заранее!

Edit: // я начинаю ProfileFragment() класс от MainActivity() (его навигации ящик) с помощью:

  ProfileFragment galleryFragment = new ProfileFragment(); 
     getSupportFragmentManager().beginTransaction() 
       .setCustomAnimations(R.anim.enter,R.anim.exit,R.anim.pop_enter, R.anim.pop_exit) 
       .replace(R.id.content_frame, galleryFragment) 
       .addToBackStack(null) 
       .commit(); 
+0

шоу полный класс LoginFragment – xFighter

+0

и как вы делаете что-то в методе выхода из системы, например SharedPreferences.Editor editor = pref.edit(); ? – xFighter

+0

Обновлено. Но я не понимаю вопроса. :( –

ответ

0

Вместо getActivity().getPreferences(0); использования PreferenceManager.getDefaultSharedPreferences(this); в вашей деятельности или PreferenceManager.getDefaultSharedPreferences(getContext()); в вашем фрагменте

+0

Я изменил все getActivity(). GetPreferences (0); to PreferenceManager.getDefaultSharedPreferences (getContext()); в Fragments, но все равно не работает ... –

+0

Вместо того, чтобы назначать это переменной в вашем классе, просто возвращайте ее снова, когда вам это нужно. Удалите 'pref = LoginFragment(). Pref;' и сравните то, что я сказал выше ('PreferenceManager.getDefaultSharedPreferences (this);'). Вы инициализируете эту переменную в 'initViews', но вы пытаетесь получить к ней доступ из только что созданного объекта, то есть' initViews' никогда не запускается, поэтому pref-объект никогда не инициализируется должным образом. – Randy

+0

Работы. Благодаря! ;) –

Смежные вопросы