2017-01-05 9 views
0

LoginFragment()クラスとクラスはNavigationDrawerActivityに実装されています。フラグメント化からアクティビティへのAndroid SharedPreferences

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)); 
} 

解決するためにどのようにそれが1を統合別のものとSharedPreferences? ありがとうございます!

編集://私はMainActivity()(そのナビゲーション引き出し)からProfileFragment()クラスを開始することによって:あなたのフラグメントで

  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); PreferenceManager.getDefaultSharedPreferences(getContext());フラグメントでは、まだ動作しません。 –

+0

クラスの変数にそれを代入するのではなく、必要に応じて再度それを取り出してください。 'pref = LoginFragment()。pref;'を削除し、それを上記のようにします( 'PreferenceManager.getDefaultSharedPreferences(this);')。あなたは 'initViews'でその変数を初期化していますが、新しく作成されたオブジェクトからその変数にアクセスしようとしています。つまり' initViews'は実行されないので、prefオブジェクトは決して適切に初期化されません。 – Randy

+0

作品。ありがとう! ;) –

関連する問題