2015-06-15 3 views
2

Я пытаюсь передать аргументы от моей деятельности к фрагменту, и я использую этот код:Попадая аргументы из пучка

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_detail); 

     String message = getIntent().getStringExtra(Intent.EXTRA_TEXT); 

     DetailActivityFragment fragment = new DetailActivityFragment(); 

     Bundle bundle = new Bundle(); 
     bundle.putString(INTENT_EXTRA, message); 

     fragment.setArguments(bundle); 
    } 

Я получаю значение переменного сообщения через Intent Extra и это прекрасно работает.
Затем я передаю его как аргумент моему фрагменту, но затем, когда я вызываю из этого конкретного фрагмента, он возвращает нулевой пакет.
У кого-нибудь есть решение?

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

     Bundle bundle = getArguments(); 

     if (bundle != null && bundle.containsKey(DetailActivity.INTENT_EXTRA)) { 
      forecast = bundle.getString(DetailActivity.INTENT_EXTRA); 
     } else if (bundle == null) { 
      Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show(); 
     } 

    } 

Верхний метод выводит сообщение Toast "Error", когда я запустить приложение ...

+0

где FragmentTransaction? Вы объявили Фрагмент в манифесте? – Blackbelt

+1

Вы создаете другой экземпляр DetailActivityFragment где-то (без аргументов) ... и вместо этого используете его – Selvin

+1

** Которая ** - ошибка, которую вы получаете? Можете ли вы разместить свой ** логарифм **, пожалуйста? Используете ли вы какую-либо ** транзакцию **? вы можете ** показать нам ** нам? –

ответ

2

Это правильный подход

Send (в деятельности):

final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

final DetailActivityFragment frg = new DetailActivityFragment(); 
ft.replace(R.id.container, frg); 

final Bundle bdl = new Bundle(); 
bdl.putString("yourKey", "Some Value"); 
frg.setArguments(bdl); 

ft.commit(); 

Получать (в Фрагменте):

final Bundle bdl = getArguments(); 

String str = ""; 
try 
{ 
    str = bdl.getString("yourKey"); 
} 
catch(final Exception e) 
{ 
    // Do nothing 
} 
+1

Он работает, но в то же время он выдает это исключение: Попытка вызвать виртуальный метод 'java.lang.String android.os.Bundle.getString (java.lang.String)' на нулевой ссылке объекта Вы знаете, почему это происходит? Спасибо за ваш ответ! –

+1

** 1 ** - Убедитесь, что у вас есть этот импорт: 'import android.os.Bundle;'. ** 2 ** - Не забудьте добавить эту строку 'final Bundle bdl = getArguments();' или ссылка на Bundle будет ** null **. –

+0

Да, у меня есть оба. Но это странно. Он работает, и он передает правильные аргументы (я вижу их по моим результатам), но в то же время он говорит, что пакет равен null. Странные вещи! –

1

Лучший способ использовать аргументы с фрагментом использовать функцию newInstance в fragment.Create статического метод, который получает ваш Params и передать их в фрагменте с помощью новой функции, например, как показано ниже:

public static myFragment newInstance(String param1, String param2) { 
    myFragment fragment = new myFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

А затем создать набор ваши глобальные аргументы:

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

    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 
} 

на своей основной деятельности будет создан фрагмент, как

myFragment __myFragment = myFragment.newInstance("test","test"); 

Это должно работать