2015-07-04 3 views
0

моя проблема состоит в том, чтобы передать строку между 3 действиями. Я объясню, как я это сделал.putExtra() не работает

первая активность, называемая loginActiviy, где я это делаю.

//OnCreate ecc before this 
    @Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    data.putExtra("Name", Name); 
    super.onActivityResult(requestCode, resultCode, data); 
} 

public void onResume() 
{ 
    super.onResume(); 
    finish(); 
} 

, когда заканчивается деятельность называется послевкусие() (возможно, это проблема, которую я не знаю), то управление переходит к первому виду деятельности, где я делаю это

//OnCreate ecc before 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Bundle extras = data.getExtras(); 
    String name = null; 
    if(extras != null) { 
     name = extras.getString("Name"); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
    try 
    { 
     Intent people = new Intent(this, MainPeopleActivity2.class); 
     people.putExtra("Name", name); 
     startActivity(people); 
     this.finish(); 
    } 
    catch(Exception e) 
    { 
     Toast.makeText(getApplicationContext(), e, Toast.LENGTH_LONG).show(); 
    } 
} 

Теперь начать третью деятельность, где берут на себя это намерение

 String name; 
    if (savedInstanceState == null) { 
     Bundle extras = getIntent().getExtras(); 
     if(extras == null) { 
      name= null; 
     } else { 
      name= extras.getString("Name"); 
     } 
    } else { 
     name = (String) savedInstanceState.getSerializable("Name"); 
    } 

Но, как вы можете себе представить, это не так, строка пуста.

Где я ошибаюсь? Заранее спасибо.

Это полный класс Логин

   public void onSuccess(LoginResult loginResult) { 
       GraphRequest.newMeRequest(
         loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
          @Override 
          public void onCompleted(JSONObject user, GraphResponse response) { 
           if (response.getError() != null) { 
           } else { 
            id = user.optString("id"); 
            firstName = user.optString("first_name"); 
            lastName = user.optString("last_name"); 
            email = user.optString("email"); 
            Log.i(TAG,"User ID "+ id); 
            Log.i(TAG,"Email "+ email); 
           } 
           Name = firstName + " " + lastName; 
           Toast.makeText(getApplicationContext(), "Log in with " + Name, Toast.LENGTH_LONG).show(); 
          } 
         }).executeAsync(); 
     } 
+0

В первом действии, почему вы выполняете 'finish()' из 'onResume()'? – TDG

+0

Немного непонятно, что вы делаете. Где вы называете 'startActivityForResult()'? –

+0

Почему бы не остановить автоматически. @TDG –

ответ

1

Вот как это выглядит, как вы могли бы устранить проблему и получить код работает.

Единственное место, где вам нужно onActivityResult() находится в действии A (первая активность).

Первый шаг в этом процессе, чтобы начать свой LoginActivity с помощью startActivityForResult(), вероятно, из onCreate():

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent i = new Intent(this, LoginActivity.class); 
    startActivityForResult(i, 999); 

} 

Затем установите ваш метод onActivityResult() в этом классе, который будет обрабатывать результат LoginActivity и отправить Имя в MainPeopleActivity2:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    //check request code and result code: 
    if (requestCode == 999 && resultCode == RESULT_OK) { 
     //get the extras: 
     Bundle extras = data.getExtras(); 
     String name = null; 
     if (extras != null) { 
      name = extras.getString("Name"); 
      try { 
       Intent people = new Intent(this, MainPeopleActivity2.class); 
       people.putExtra("Name", name); 
       startActivity(people); 
       //this.finish(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 

Тогда ваш метод onSuccess() в LoginActivity потребуется некоторый добавленный код здесь. Отправить имя обратно к первой деятельности с призывом setResult():

public void onSuccess(LoginResult loginResult) { 
    GraphRequest.newMeRequest(
      loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(JSONObject user, GraphResponse response) { 
        if (response.getError() != null) { 
         //process error 
        } else { 
         id = user.optString("id"); 
         firstName = user.optString("first_name"); 
         lastName = user.optString("last_name"); 
         email = user.optString("email"); 
         Log.i(TAG,"User ID "+ id); 
         Log.i(TAG, "Email " + email); 

         Name = firstName + " " + lastName; 
         Toast.makeText(getApplicationContext(), "Log in with " + Name, Toast.LENGTH_LONG).show(); 

         //adding this: 
         Intent i = new Intent(); 
         i.putExtra("Name", Name); 
         LoginActivity.this.setResult(RESULT_OK, i); 
         LoginActivity.this.finish(); 
        } 


       } 
      }).executeAsync(); 
} 

Тогда вы сможете успешно получить имя в вашей MainPeopleActivity2 активность в onCreate():

public class MainPeopleActivity2 extends ActionBarActivity { 

    String name; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_MainPeopleActivity2); 

     if (savedInstanceState == null) { 
      Bundle extras = getIntent().getExtras(); 
      if(extras == null) { 
       name= null; 
      } else { 
       name= extras.getString("Name"); 
      } 
     } else { 
      name = (String) savedInstanceState.getSerializable("Name"); 
     } 

    } 

    //...... rest of the code in this class 
0

Правильный способ передать результат из вызываемой Activity в вызывающую активность - использовать Activity.setResult (int, Intent) в вызываемой деятельности: http://developer.android.com/reference/android/app/Activity.html#setResult(int, android.content.Intent)

Вызывающая деятельность должна вызвать startActivityForR esult() вместо startActivity(), чтобы вернуть результат.

+0

Конечно, я чувствовал себя как @DanieNugent, но ничего не говорит ... –

+0

Я дал короткий ответ с важными битами, он дал длинный. – BladeCoder

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