Problem mit Fragments im Viewpager

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit Fragments im Viewpager

    Hallo Android Developers
    ich habe ein Problem mit meiner App.
    In einem Fragment sind mehrere Button dynamisch erzeugt worden, durch das klicken auf einen dieser Button wird
    ein Fragment geöffnet werden in dem sich ein Viewpager befindet.
    In dem Viewpager sind Erneut 2. Fragments mittels Adapter drin.
    Im ersten Fragment kann man was mit einem Spinner einstellen, durch einen Button, gelangt man wieder in das Fragment mit den vielen Buttons, nun soll dr Button auf den geklickt worden ist den Spinner text anzeigen.
    Nun zum eigentlichen Problem, klickt man nun erneut auf einen Button im Fragment mit den vielen Button, wird nur eine leere weiße Seite angezeigt.

    Klasse Playground: Dort befinden sich die vielen Buttons.
    Klasse Tisch: playground erzeugt Buttons von Tisch
    (Tisch extends Button)
    Klasse: Table Setting: Wird aufgerufen wenn man auf Button klickt
    Klasse: TableFragmentOne : ISt Fragment im ViewPager

    Java-Quellcode

    1. public class TableFragmentOne extends Fragment {
    2. public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
    3. private int practiceTime;
    4. private String practiceText;
    5. private OneInterfaceListener mListener;
    6. private int butId;
    7. public TableFragmentOne() {
    8. }
    9. @Override
    10. public void onAttachFragment(Fragment childFragment) {
    11. super.onAttachFragment(childFragment);
    12. }
    13. public static final TableFragmentOne newInstance(String message, int buttonId) {
    14. TableFragmentOne f = new TableFragmentOne();
    15. Bundle bdl = new Bundle(1);
    16. bdl.putString(EXTRA_MESSAGE, message);
    17. f.setArguments(bdl);
    18. f.butId = buttonId;
    19. return f;
    20. }
    21. @Override
    22. public void onCreate(Bundle savedInstanceState) {
    23. super.onCreate(savedInstanceState);
    24. }
    25. @Override
    26. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    27. View v = inflater.inflate(R.layout.tablefragmentone, container, false);
    28. createPracticeSpinner(v);
    29. createTimeSpinner2(v);
    30. Toast.makeText(v.getContext(), "One", Toast.LENGTH_SHORT).show();
    31. createPracticeButton(v);
    32. return v;
    33. }
    34. @Override
    35. public void onAttach(Context context) {
    36. super.onAttach(context);
    37. if (context instanceof TableFragmentOne.OneInterfaceListener) {
    38. mListener = (TableFragmentOne.OneInterfaceListener) context;
    39. } else {
    40. throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
    41. }
    42. }
    43. /**
    44. * Spinner Die Text Angaben der Übungen
    45. ***/
    46. private void createPracticeSpinner(View v) {
    47. final Spinner textSpinner = (Spinner) v.findViewById(R.id.practiceSpinner);
    48. ArrayAdapter<CharSequence> textAdapter;
    49. boolean b = mListener.getBeginnerBool();
    50. boolean a = mListener.getAdvancedBool();
    51. if (b == true && a == false) {
    52. textAdapter = ArrayAdapter.createFromResource(v.getContext(), R.array.practicebeginner, android.R.layout.simple_spinner_item);
    53. }
    54. if (a == true && b == false) {
    55. textAdapter = ArrayAdapter.createFromResource(v.getContext(), R.array.practiceadvanced, android.R.layout.simple_spinner_item);
    56. }else{
    57. textAdapter = ArrayAdapter.createFromResource(v.getContext(), R.array.practiceboth, android.R.layout.simple_spinner_item);
    58. }
    59. textSpinner.setAdapter(textAdapter);
    60. textSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    61. @Override
    62. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    63. setPracticeText((String) parent.getItemAtPosition(position));
    64. }
    65. @Override
    66. public void onNothingSelected(AdapterView<?> parent) {
    67. }
    68. });
    69. }
    70. /**
    71. * Spinner für die Zeit der Übungen
    72. */
    73. private void createTimeSpinner2(View v) {
    74. final Spinner timeSpinner = (Spinner) v.findViewById(R.id.timeSpinner);
    75. ArrayAdapter<CharSequence> timeAdapter = ArrayAdapter.createFromResource(v.getContext(), R.array.timepractice, android.R.layout.simple_spinner_item);
    76. timeSpinner.setAdapter(timeAdapter);
    77. timeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    78. @Override
    79. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    80. setPraticeTime(Integer.valueOf((String) parent.getItemAtPosition(position)));
    81. }
    82. @Override
    83. public void onNothingSelected(AdapterView<?> parent) {
    84. }
    85. });
    86. }
    87. /*Übungs starter Button*/
    88. private void createPracticeButton(View v) {
    89. Toast.makeText(v.getContext(), "Button One", Toast.LENGTH_SHORT).show();
    90. final Button trainButton = (Button) v.findViewById(R.id.practiceButton);
    91. Toast.makeText(v.getContext(), "Danach Button One", Toast.LENGTH_SHORT).show();
    92. trainButton.setOnClickListener(new View.OnClickListener() {
    93. @Override
    94. public void onClick(View v) {
    95. Toast.makeText(v.getContext(), "Lets go!!", Toast.LENGTH_SHORT).show();
    96. goBackToPlayground(v);
    97. }
    98. });
    99. }
    100. /***Button Listener der die Übung starten soll***/
    101. private void goBackToPlayground(View v) {
    102. Toast.makeText(v.getContext(), "Back Test", Toast.LENGTH_SHORT).show();
    103. /*Daten von ÜbungsSpinner und vom TimeSpinner müssen gespeichert und übergeben werden*/
    104. /*ÜbungsSpinner TableFragmentTwo*/
    105. /*Timespinner an Playground*/
    106. mListener.practiceSetting(getPracticeTime(), getPracticeText(), butId);
    107. /*Funktion die über das Interface zum Playground wechselt**/
    108. mListener.startEndlichMal();
    109. }
    110. /*Spinner Listener*/
    111. private void setPracticeText(String practiceText) {
    112. this.practiceText = practiceText;
    113. }
    114. private void setPraticeTime(Integer integer) {
    115. this.practiceTime = integer;
    116. }
    117. /**
    118. * Getter und Setter
    119. */
    120. public String getPracticeText() {
    121. return practiceText;
    122. }
    123. public int getPracticeTime() {
    124. return practiceTime;
    125. }
    126. /*Interface**/
    127. public interface OneInterfaceListener {
    128. // TODO: Update argument type and name
    129. void startEndlichMal();
    130. void practiceSetting(int practiceTime, String practiceText, int buttonId);
    131. // Intent getInterfaceI();
    132. Boolean getBeginnerBool();
    133. Boolean getAdvancedBool();
    134. }
    135. }
    Alles anzeigen
  • Java-Quellcode

    1. public class TableSetting extends Fragment {
    2. ViewPager mPager;
    3. //MyPageAdapter pageAdapter;
    4. public TableSettingInterfaceListener mListener;
    5. public MyPageAdapter test;
    6. public TableFragmentOne frago;
    7. public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
    8. public static int buttonId = 0;
    9. /* public static final TableSetting newInstance(String message)
    10. {
    11. TableSetting f = new TableSetting();
    12. Bundle bdl = new Bundle(1);
    13. bdl.putString(EXTRA_MESSAGE, message);
    14. f.setArguments(bdl);
    15. return f;
    16. }*/
    17. @Override
    18. public void onCreate(Bundle savedInstanceState) {
    19. super.onCreate(savedInstanceState);
    20. }
    21. public static TableSetting newInstance(int param1) {
    22. TableSetting fragment = new TableSetting();
    23. Bundle args = new Bundle(0);
    24. args.putInt(String.valueOf(buttonId), param1);
    25. fragment.setArguments(args);
    26. return fragment;
    27. }
    28. @Override
    29. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    30. View v = inflater.inflate(R.layout.tablesetting, container, false);
    31. mPager = (ViewPager) v.findViewById(R.id.pager);
    32. MyPageAdapter pageAdapter;
    33. List<Fragment> fragments = getFragments(buttonId);
    34. pageAdapter = new MyPageAdapter(mListener.getManager(), fragments);
    35. mPager.setAdapter(pageAdapter);
    36. return v;
    37. }
    38. @Override
    39. public void onActivityCreated(Bundle savedInstanceState) {
    40. super.onActivityCreated(savedInstanceState);
    41. Toast.makeText(getView().getContext(), "in on Actitivycreated", Toast.LENGTH_SHORT).show();
    42. if (mListener != null) {
    43. Toast.makeText(getView().getContext(), "vor Adapter", Toast.LENGTH_SHORT).show();
    44. /*pageAdapter = new MyPageAdapter[4];
    45. List<Fragment> fragments = getFragments();
    46. for (int k = 0; k < 4; k++) {
    47. pageAdapter[k] = new MyPageAdapter(getSupportFragmentManager(), fragments);
    48. }
    49. /* MyPageAdapter pageAdapter;
    50. List<Fragment> fragments = getFragments();
    51. pageAdapter = new MyPageAdapter(mListener.getManager(), fragments);
    52. mPager.setAdapter(pageAdapter);*/
    53. }
    54. }
    55. @Override
    56. public void onAttach(Context context) {
    57. super.onAttach(context);
    58. if (context instanceof TableSetting.TableSettingInterfaceListener) {
    59. mListener = (TableSetting.TableSettingInterfaceListener) context;
    60. } else {
    61. throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
    62. }
    63. }
    64. public void firstTest() {
    65. this.goBackToTableSetting();
    66. }
    67. @Override
    68. public void onDetach() {
    69. super.onDetach();
    70. mListener = null;
    71. }
    72. public void goBackToTableSetting() {
    73. mListener.goBack();
    74. }
    75. private List<Fragment> getFragments(int buttonId) {
    76. List<Fragment> fList = new ArrayList<Fragment>();
    77. fList.add(TableFragmentOne.newInstance("Fragment 1",buttonId));
    78. fList.add(TableFragmentTwo.newInstance("Fragment 2", "test"));
    79. //fList.add(new TableFragmentOne());
    80. //fList.add(new TableFragmentTwo());
    81. return fList;
    82. }
    83. /*Getter und Setter*/
    84. public ViewPager getmPager() {
    85. return mPager;
    86. }
    87. public void setmPager(ViewPager mPager) {
    88. this.mPager = mPager;
    89. }
    90. public interface TableSettingInterfaceListener {
    91. // MyPageAdapter getTableSetting(int id);
    92. void goBack();
    93. FragmentManager getManager();
    94. }
    95. }
    96. /**MyPageAdapter für die Klasse**/
    97. class MyPageAdapter extends FragmentPagerAdapter {
    98. private List<Fragment> fragments;
    99. public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
    100. super(fm);
    101. this.fragments = fragments;
    102. }
    103. @Override
    104. public Fragment getItem(int position) {
    105. return this.fragments.get(position);
    106. }
    107. @Override
    108. public int getCount() {
    109. return this.fragments.size();
    110. }
    111. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Leumas ()

  • Hi werde aus deiner Beschreibung nicht Richtig Schlau.

    Klasse Playground: ist der Start.
    welche Klasse wird dann aufgerufen ?
    zuletzt ist man wieder in der Playground richtig?
    dann willst du wieder eine Klasse aufrufen die dann weiss bleibt richtig? welche Klasse ist das?

    Wie rufst du die Klassen auf und wie kommst du zurück?
    Ein Feedback auf Tipps ist auch schön. :P
  • Playground definiert die Buttons und die zugehörigen Listener.
    Klick auf Button führt zu TableSetting Klasse(Fragment) die hat ein ViewPager als XML Layout,
    im ViewPager ist OneFragment

    OneFragment hat Button führt wieder zu Playground

    Im Playground klick auf Buttons -> weiße Seite: Und nicht wie erwartet TableSettingKlasse mit OneFragment

    Die Klassen ruf ich jeweils in der Main auf, dies mach ich mit Interfaces

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Leumas ()

  • Java-Quellcode: Playground Klasse

    1. private void makeTable(RelativeLayout rela, int anzahlTische, final View v) {
    2. // int anzahlTische =3 Toast.makeText(Setting.this, "Click table"+tableend, Toast.LENGTH_SHORT).show();
    3. Toast.makeText(v.getContext(), "Click anzahlTische" + anzahlTische, Toast.LENGTH_SHORT).show();
    4. myTischArray = new Tisch[anzahlTische];
    5. for (int i = 0; i < anzahlTische; i++) {
    6. /*Neue mit Zeit*/
    7. // myTischArray[i] = new Tisch(v.getContext(), i,mListener.getPracticeTimeforPlayground());
    8. myTischArray[i] = new Tisch(v.getContext(), i);
    9. myTischArray[i].startTableTimer(45, myTischArray[i]);
    10. myTischArray[i].setOnClickListener(new View.OnClickListener() {
    11. @Override
    12. public void onClick(View v) {
    13. tableSetting(v);
    14. }
    15. });
    16. // Toast.makeText(v.getContext(), " vor add relaClick I "+i, Toast.LENGTH_SHORT).show();
    17. rela.addView(myTischArray[i]);
    18. // Toast.makeText(v.getContext(), "nach add rela "+i, Toast.LENGTH_SHORT).show();
    19. }
    20. }
    21. /*** Listener mit Klick auf Platte*/
    22. private void tableSetting(View v) {
    23. int buttonId = v.getId();
    24. Toast.makeText(v.getContext(), "Table Button Test" + buttonId + "", Toast.LENGTH_SHORT).show();
    25. mListener.startTableSettingPlay(buttonId);
    26. // mListener.startTableSettingPlay(tablesettingarray[test],test);
    27. }
    Alles anzeigen

    Java-Quellcode: Main

    1. /*Zeigt das Spielfeld mit Tischen an*/
    2. public void startPlayground() {
    3. fragmentTransaction = getSupportFragmentManager().beginTransaction();
    4. fragmentTransaction.replace(R.id.frameLayout, playground);
    5. fragmentTransaction.commit();
    6. getSupportActionBar().setTitle("Halle");
    7. }
    8. /**Vorläufige Table Setting aktivierung*/
    9. public void startTableSetting(int buttonId) {
    10. fragmentTransaction = getSupportFragmentManager().beginTransaction();
    11. fragmentTransaction.replace(R.id.frameLayout, TableSetting.newInstance(buttonId));
    12. fragmentTransaction.commit();
    13. getSupportActionBar().setTitle("Uebung");
    14. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Leumas ()

  • also ohne v geht nicht da wirds rot
    warum nicht in dieser Zeile?
    bin erst Anfänger in der Android programmierung, habs halt so gedacht, deshalb in der Zeile
    außerdem hab ich das bei den anderen Fragments auch so gemacht

    Deine Annahme das er erst beim zweiten Aufruf weiß(bzw. leer ist) ist richtig

    wenn ichs in d Main aufrufe wirds beim zweitem Mal auch wieder weiß

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Leumas ()

  • versuche mal getActivity().findView.... Denke du brauchst den Kontext der activity in dem dein Fragment läuft.

    Mit in dieser Zeile meinte ich ob ich die richtige Zeile aus deinem Quellcode kopiert habe ,dies sollte keine Verwunderung ausdrücken.
    Was du auch versuchen kannst ist . Den folgenden Code von dir, nicht in die onCeateView Methode zu schreiben sondern in die in onActivityCeate Methode habe bei meinen Programmen öfters Probleme in der view Methode gehabt .
    1. mPager = (ViewPager) v.findViewById(R.id.pager);
    2. MyPageAdapter pageAdapter;
    3. List<Fragment> fragments = getFragments(buttonId);
    4. pageAdapter = new MyPageAdapter(mListener.getManager(), fragments);
    5. mPager.setAdapter(pageAdapter);
    Hoffe das hilft .
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • Hat leider nichts geholfen

    liegts vielleicht am XML text?

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  • Schade dann weiß ich leider im moment auch nicht weiter.
    Es sollte eigentlich mir dem Kontext der Aktivity die id gefunden werden.
    Ist den zu Laufzeit auch das layout mit der id auch geladen inflatet? Hast du es versucht die id in der onActivityCeate Methode zu zu suchen?
    Teste mit dem debuger oder logcat ob die Methoden durchlaufen werden.

    Die id im XML ist auch keinem layout Typ zugeordnet . Erstelle mal zum zum Test ein layout oder andere view mit id und teste ob die gefunden wird.

    Viel Erfolg
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • Also, dein erstes problem ist schonmal die komplexität deiner view. Das ist alles total verwirrend und komplex. Das ist schon ein indikator dafür dass du dir ein einfacheres layout deiner app ausdenken solltest.

    Irgendwie hab ich auch rauslesen können dass du die selbe activity in sich nochmal aufrufst? Korrigiere mich wenn ich mich verlesen habe. Aber das ist ebenfalls keine schöne lösung.
    Wenn du eine Activity wieder im vordergrund möchtest solltest du zu dieser zurück gehen oder an der stelle auch mit fragmenten arbeiten.

    Kommen wir zu deinem eigentlichen problem. Dein Fehler liegt vermutlich hier "TableSetting.newInstance(buttonId)"
    Entweder ist deine buttonId falsch, weil die Id der view in makeTable benommen wurde (die heißt dort nämlich auch v), oder, was ich eher denke, TableSetting.newInstance liefert das falsche fragment zurück.