2016-08-06 20 views
0

Ich habe Facebook Login-Code innerhalb Fragment hinzugefügt. Alles funktioniert gut, ich kann mich in meine App einloggen, aber wenn ich das Fragment ändere oder die App nach dem Login wieder öffne, sind alle Daten verschwunden, zB email, name, birthday.it zeigt keine Daten an. Also, was soll ich tun, um diese Daten zu speichern.Facebook Login Datenverlust nach Wiedereröffnung App

Code

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

hinzufügen alle Werte in der lokalen Datenbank ya Präferenz geteilt – Destro

+0

Warum Sie nicht Ihre FB Login-Daten in „SharedPreference“ speichern –

+0

i mit SharedPreference versucht, aber es hat nicht funktioniert –

Antwort

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

Keine Notwendigkeit, dies zu tun.

Wenn Sie das Fragment dann wieder aufnehmen, erstellt es gerade die neue Instanz Ihres Facebook-Profils, weshalb Datenverluste auftreten.

im resume nur reload fragment nicht erstellen neue instace.

Wenn Sie Daten von Facebook api erhalten, speichern Sie sie sofort in den gemeinsamen Einstellungen. Danach können Sie diese Daten abrufen, wann immer Sie möchten.

+0

hat nicht funktioniert @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 
} 

}

Versuchen Sie den Code in dieses Fragment Lebenszyklus zu integrieren. es wird sicherlich funktionieren.

Es besteht keine Notwendigkeit onResume()

nur tun Sie Ihre Sachen in loadUpdates() hinzuzufügen; Methode.

+0

ok ich werde es versuchen –

+0

gibt es keine Notwendigkeit von SharedPreference jetzt? @Dnyanesh –

+0

funktioniert meine Codierung? – Dnyanesh

0

Ich habe Ihren Code mit SharedPreference geändert. Sie können das versuchen.

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

oben Code Ersetzen mit Ihrem vorhandenen Code, sobald Sie erfolgreich Benutzerprofilinformationen von FB

+0

Versuchen Sie und lassen Sie mich wissen, funktioniert das oder nicht –

+0

nope.not funktioniert –

+0

Haben Sie versucht, Werte von Voreinstellungen in einer anderen Klasse mit dem gleichen Dateinamen und Schlüsselname, nur für Testzwecke nach Einstellung der Präferenz in der oben genannten Klasse. –

0

Ich denke, Ihr Problem ist Ihr SharedPreferences mit einem Activity initialisiert wurde erhalten. Um zu vermeiden, dass Ihre Daten verloren gehen, wenn die Activity zerstört wird, sollten Sie ApplicationContext() verwenden.
machte ich eine getrennte Klasse mit SharedPreference wie folgt aus:

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

In Ihrem Fragment, SharedPreferences mit Initialisierung:

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

Ihre Daten zu speichern:

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

Abrufen von Daten zu späteren Zeiten durch angerufen:

+0

Danke, ich werde dies versuchen. @ Hong-Thai –