Как говорится в названии.
Я загрузил код Fragment
здесь, http://developer.android.com/shareables/training/FragmentBasics.zip.
Это пример фрагмента из Официального сайта разработчика Android. http://developer.android.com/training/basics/fragments/fragment-ui.html
Это MainActivity.java
onCreate()
:
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
// Check whether the activity is using the layout version with
// the fragment_container FrameLayout. If so, we must add the first fragment
if (findViewById(R.id.fragment_container) != null) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if (savedInstanceState != null) {
return;
}
// Create an instance of ExampleFragment
HeadlinesFragment fragment = new HeadlinesFragment();
// In case this activity was started with special instructions from an Intent,
// pass the Intent extras to the fragment as arguments
//fragment.setArguments(getIntent().getExtras());
Bundle args= new Bundle();
args.putString("category", "clothes");
args.putString("item", "shirts");
fragment.setArguments(args);
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment).commit();
}
}
И HeadlinesFragment.java
onCreate()
:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We need to use a different list item layout for devices older than Honeycomb
int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;
Bundle args = getArguments();
if (args == null) {
Toast.makeText(getActivity(), "arguments is null " , Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), "text " + args , Toast.LENGTH_LONG).show();
}
// Create an array adapter for the list view, using the Ipsum headlines array
setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines));
}
Я прочитал несколько QA здесь, как этот Фрагмент getArguments() возвращает null, и многие другие, связанные с setArguments()
и getArguments()
, но все еще я застрял.
И я переместил код Bundle
и Toast
в onAttach()
и onCreateView()
безрезультатно. Что случилось с моим кодом? Я думаю, что я что-то упустил, но не знаю, что это.
Пожалуйста помоги! Спасибо.
Edit:
Я сформулирую свое намерение более четко. В FragmentBasic, который я загрузил, есть MainActivity.java, HeadlinesFragment.java и ArticlesFragment.java. "Общение" от MainActivity.java до ArticlesFragment.java не является проблемой здесь. Я хочу отправить данные из MainActivity.java в HeadlinesFragment.java. Их связь такая:
--------------------------------------
| MainActivity <-> HeadlinesFragment |
| | |
| |>> ArticlesFragment |
--------------------------------------
И HeadlinesFragment
работает в Runtime.
* Этот код работает при использовании Android-гаджета с < Ширина 600 пикселей. Но не работает при использовании на планшете ( >= 600 пикселей), как доказано в @Tesla1984 ниже. Но то, что я хочу, это тот же результат либо на гаджете < 600 пикселей и гаджет > 600 пикселей.