Jak sugeruje tytuł.
Pobrałem kod Fragment
stąd,.
To jest przykład fragmentu z oficjalnej witryny dla programistów Androida. http://developer.android.com/training/basics/fragments/fragment-ui.htmlFragment Androida getArguments() zwraca wartość null
To MainActivity.java
's 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's 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();
}
}
I HeadlinesFragment.java
' s 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));
}
Czytałem kilka QA tutaj, jak ten Fragment getArguments() returns null i wiele inne związane z setArguments()
i , ale nadal utknąłem.
A ja przeniósł Bundle
i Toast
kod do onAttach()
i onCreateView()
z bezskutecznie. Co jest nie tak z moim kodem? Myślę, że czegoś brakuje, ale nie wiem co to jest.
Proszę o pomoc! Dzięki.
Edytuj:
Wyrażam wyraźniej moją intencję. W pobranym fragmencie FragmentBasic znajdują się MainActivity.java, HeadlinesFragment.java i ArticleFragment.java. "Komunikacja" od MainActivity.java do ArticlesFragment.java nie jest tutaj problemem. Chcę tylko wysłać dane z MainActivity.java do HeadlinesFragment.java. Ich połączenie jest następujące:
--------------------------------------
| MainActivity <-> HeadlinesFragment |
| | |
| |>> ArticlesFragment |
--------------------------------------
I HeadlinesFragment
działa w środowisku wykonawczym.
* Ten kod działa, gdy używasz gadżetu Android z rozszerzeniem < o szerokości 600 pikseli. Ale nie działa podczas korzystania z tabletu (> = 600px), Jak udowodniono przez @ Tesla1984 poniżej. Ale to, czego chcę, to ten sam wynik na gadżecie < 600px i gadżecie> 600px.
Sprawdziłem kod i 'getArguments()' nie jest pusty. jeśli powyższy kod jest twoim rzeczywistym kodem, nie sądzę, że coś jest nie tak. jeśli nie, sprawdź zmienne? – tesla1984
@ tesla1984: w której części wstawiasz swój kod? w HeadlinesFragment.java lub ArticlesFragment.java? Bo gdziekolwiek wstawię 'getArguments()' w HeadlinesFragment.java, otrzymuję wartość null. Dzięki. – tonny
Czasami moje zaćmienie + ADT nie działa! .. Potrzebuję oczyścić projekt i ponownie uruchomić ... –