2016-08-06 2 views
0

Я добавил код входа в Facebook внутри фрагмента. Все работает нормально, я могу войти в мое приложение, но когда я меняю фрагмент или открываю приложение после входа в систему, все данные уходят. Я пишу по электронной почте, имени, birthday.it не показывает никаких данных. Так что я должен делать, чтобы сохранить эти данные.Потеря данных для входа в Facebook после открытия приложения

код

public class ProfileFragment extends Fragment{ 
    ProfileTracker profileTracker; 
    RelativeLayout fbbg; 
    RelativeLayout rl; 
    LoginButton btnLogin; 
    CallbackManager callbackManager; 
    AccessTokenTracker accessTokenTracker; 
    CircleImageView profilePicture; 
    TextView email; 
    TextView gender; 
    TextView facebookName; 
    TextView birthday; 
    SharedPreferences pref; 

    public static final List<String> mPermissions = new ArrayList<String>() {{ 
    add("public_profile"); 
    add("email"); 
    add("user_photos"); 
    add("user_birthday"); 
}}; 

    @Nullable 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstantState) { 
    View view = inflater.inflate(R.layout.profile, container, false); 
    FacebookSdk.sdkInitialize(getActivity()); 
    btnLogin = (LoginButton)view.findViewById(R.id.view); 

    email = (TextView)view.findViewById(R.id.un2); 

    facebookName = (TextView)view.findViewById(R.id.username); 

    birthday = (TextView)view.findViewById(R.id.bd2); 

    gender = (TextView)view.findViewById(R.id.gnd2); 

    profilePicture = (CircleImageView)view.findViewById(R.id.profile_image); 

    rl = (RelativeLayout) view.findViewById(R.id.rl); 

    fbbg = (RelativeLayout) view.findViewById(R.id.relativeLayout); 

    callbackManager = CallbackManager.Factory.create(); 
    btnLogin.setReadPermissions(mPermissions); 
    btnLogin.setFragment(this); 
    btnLogin.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 

     @Override 
     public void onSuccess(LoginResult loginResult) { 
      AccessToken accessToken = loginResult.getAccessToken(); 
      Profile profile = Profile.getCurrentProfile(); 
      GraphRequest request = GraphRequest.newMeRequest(
        loginResult.getAccessToken(), 
        new GraphRequest.GraphJSONObjectCallback() { 

         @Override 
         public void onCompleted(JSONObject object, GraphResponse response) { 
          Log.d("JSON", ""+response.getJSONObject().toString()); 
          try { 
           fbbg.setVisibility(View.GONE); 
           rl.setVisibility(View.VISIBLE); 
           email.setText(object.getString("email")); 
           gender.setText(object.getString("gender")); 
           facebookName.setText(object.getString("name")); 
           birthday.setText(object.getString("birthday")); 
           Glide.with(getActivity()) 
             .load("https://graph.facebook.com/" + object.getString("id") + "/picture?type=large") 
             .into(profilePicture); 
           pref = getActivity().getSharedPreferences("", getActivity().MODE_PRIVATE); 
           SharedPreferences.Editor editor = pref.edit(); 
           editor.putString("name", String.valueOf(facebookName)); 
           editor.putString("email", String.valueOf(email)); 
           editor.putString("gender", String.valueOf(gender)); 
           editor.putString("birthday", String.valueOf(birthday)); 
           editor.commit(); 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
      Bundle parameters = new Bundle(); 
      parameters.putString("fields", "id,name,email,gender,birthday"); 
      request.setParameters(parameters); 
      request.executeAsync(); 

      accessTokenTracker = new AccessTokenTracker() { 
       @Override 
       protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, 
                  AccessToken currentAccessToken) { 
        if (currentAccessToken == null) { 
         facebookName.setText(""); 
         email.setText(""); 
         gender.setText(""); 
         birthday.setText(""); 
         profilePicture.setImageResource(R.drawable.user); 
        } 
       } 
      }; 
      profileTracker = new ProfileTracker() { 
       @Override 
       protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) { 
       } 
      }; 

      accessTokenTracker.startTracking(); 
      profileTracker.startTracking(); 
     } 


     @Override 
     public void onCancel() { 
      Toast.makeText(getActivity(),"Cancled to Login Facebook", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onError(FacebookException exception) { 
      Toast.makeText(getActivity(),"Error to Login Facebook", Toast.LENGTH_SHORT).show(); 
     } 
    }); return view; 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    pref = getActivity().getSharedPreferences("", getActivity().MODE_PRIVATE); 
    pref.getString("name", "asdfgh"); 
    pref.getString("email", "qwerty"); 
    pref.getString("gender", "zxcvb"); 
    pref.getString("birthday", "kdhfaj"); 
} 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      onResume(); 
     } 
    }, 2000); 
} 

}

After login pic After reopening app pic

+0

добавить все значения в локальной базе данных я общее предпочтение – Destro

+0

Почему вы не сохраните регистрационные данные FB в «SharedPreference» –

+0

я пытался с SharedPreference, но это не сработало –

ответ

0
@Override 
public void onResume() { 
    super.onResume(); 
    Profile profile = Profile.getCurrentProfile(); 
    AppEventsLogger.activateApp(getActivity()); 
} 

Нет необходимости делать это.

всякий раз, когда вы возобновляете фрагмент, тогда это создает новый экземпляр вашего профиля facebook, из-за которого происходит потеря данных.

на резюме просто перезагрузить фрагмент, не создавайте новый инстас.

всякий раз, когда вы получаете данные из facebook api, немедленно храните их в общих предпочтениях. после этого вы можете получать эти данные всякий раз, когда вам нужно.

+0

не работал @dnyanesh –

0
public UpdateFragment() { 
    // Required empty public constructor 
} 

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

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    v = inflater.inflate(R.layout.fragment_updates, container, false); 

    listView = (ListView) v.findViewById(R.id.listView); 

    // define your xml resources here 

    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setRetainInstance(true); 

    loadUpdates(); 
} 

private void loadUpdates() { 

     // api call 
} 

}

Попытка внедрить свой код в этот фрагмент жизненного цикла. он, безусловно, будет работать.

Там нет необходимости добавлять onResume()

просто сделать свой материал в loadUpdates(); метод.

+0

ok я попробую его –

+0

есть ли необходимость SharedPreference сейчас? @Dnyanesh –

+0

Мое кодирование работает? – Dnyanesh

0

Я изменил ваш код wrt SharedPreference. Вы можете попробовать это.

 pref = getActivity().getSharedPreferences("GIVE SOME name TO FILE", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = pref.edit(); 
     editor.putString("name", object.getString("name")); 
     editor.putString("email", object.getString("email")); 
     editor.putString("gender", object.getString("gender")); 
     editor.putString("birthday", object.getString("birthday")); 
     editor.apply(); 

Заменить выше код с существующим кодом, как только вы успешно получить информацию о профиле пользователя из FB

+0

Попробуйте и дайте мне знать, это работает или нет –

+0

nope.not working –

+0

Вы пытались получить значения из настроек в каком-то другом классе с тем же именем файла и именем ключа, только для целей тестирования после установки предпочтения в вышеупомянутом классе. –

0

Я думаю, ваша проблема в том, ваш SharedPreferences был инициализирован с Activity. Чтобы избежать потери ваших данных при уничтожении Activity, вы должны использовать ApplicationContext().
Я сделал отделенный класс с SharedPreference, как это:

public class SessionManager { 

// Shared Preferences reference 
public SharedPreferences pref; 

// Editor reference for Shared preferences 
private Editor editor; 

@SuppressWarnings("unused") 
private Context context; 
int PRIVATE_MODE = 0; 
public static final String PREFER_NAME = "login"; 
public static final String KEY_USER_NAME = "username"; 

public SessionManager(Context context) { 
    this.context = context; 
    pref = context.getSharedPreferences(PREFER_NAME, PRIVATE_MODE); 
    editor = pref.edit(); 
} 

public String getUserName() { 
    return pref.getString(KEY_USER_NAME, ""); 
} 

public void setUserName(String userName) { 
    editor.putString(KEY_USER_NAME, userName); 
    editor.commit(); 
} 

В вашем Fragment, инициализирует SharedPreferences с:

sessionManager = new SessionManager(getActivity.getApplicationContext()); 

Сохранение данных:

session.setUserName(object.getString("name")); 

получения данных в более поздние времена по телефону:

String userName = session.getUserName(); 
+0

спасибо, я попробую это. @ Hong-thai –

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