FragmentTransaction hide und show funktioniert nicht!

  • Antworten:6
Philipp H
  • Forum-Beiträge: 184

26.04.2015, 18:18:20 via Website

Hallo ich habe ein Problem ich habe bis jetzt 2 Fragments und will diese je nach buttonclick show oder hiden nur tut es das ganze nicht was es soll. Hier mal der Code:

public class MainFragment extends Fragment implements View.OnClickListener  {

public Button buttonWebshop,buttonNews, buttonAktionen, buttonUeberUns;
private FragmentManager fm;
private FragmentTransaction ft ;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    fm = getFragmentManager();
    ft = fm.beginTransaction();

    View v = inflater.inflate(R.layout.fragment_main, container, false);

    buttonWebshop = (Button) v.findViewById(R.id.buttonWebShop);
    buttonNews = (Button) v.findViewById(R.id.buttonNews);
    buttonAktionen = (Button)v.findViewById(R.id.buttonAktionen);
    buttonUeberUns = (Button) v.findViewById(R.id.buttonUeberUns);

    buttonWebshop.setOnClickListener(this);
    buttonNews.setOnClickListener(this);
    buttonAktionen.setOnClickListener(this);
    buttonUeberUns.setOnClickListener(this);



    // Inflate the layout for this fragment
    return v;
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

}

@Override
public void onDetach() {
    super.onDetach();

}

@Override
public void onClick(View v) {
    WebshopFragment webshopFragment = new WebshopFragment();
    MainFragment mFragment = new MainFragment();

    if(v.getId() == R.id.buttonWebShop) {




            ft.hide(mFragment);
            ft.show(webshopFragment);
    }
}

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.04.2015, 18:39:33 via Website

Eine neue instanz erstellen funktioniert nicht, du musst noch das Layout etc zuordnen.
Normalerweise hat dam dafür eine Steuerungsactivity die alle Fragments verwaltet:

Code für FragmentTransactions:

    // get fragment manager
FragmentManager fm = getFragmentManager();

// add
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.your_placehodler, new YourFragment());
// alternatively add it with a tag
// trx.add(R.id.your_placehodler, new YourFragment(), "detail");
ft.commit();

// replace
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.your_placehodler, new YourFragment());
ft.commit();

// remove
Fragment fragment = fm.findFragmentById(R.id.your_placehodler);
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment);
ft.commit(); 

Zum nachlesen: http://www.vogella.com/tutorials/AndroidFragments/article.html

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Philipp H
  • Forum-Beiträge: 184

27.04.2015, 19:36:45 via App

Hallo ich bekomme jetzt aufeinmal eine nullpointerexception in der on click Methode weiß aber nicht warum hier der Code (sorry das der Code nicht in diesem Code elektronische ist bin auf dem Handy on)
public class MainFragment extends Fragment implements View.OnClickListener {

public Button buttonWebshop,buttonNews, buttonAktionen, buttonUeberUns;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{

setMenuVisibility(true);

View v = inflater.inflate(R.layout.fragment_main, container, false);



buttonWebshop = (Button) v.findViewById(R.id.buttonWebShop);
buttonNews = (Button) v.findViewById(R.id.buttonNews);
buttonAktionen = (Button)v.findViewById(R.id.buttonAktionen);
buttonUeberUns = (Button) v.findViewById(R.id.buttonUeberUns);

buttonWebshop.setOnClickListener(this);
buttonNews.setOnClickListener(this);
buttonAktionen.setOnClickListener(this);
buttonUeberUns.setOnClickListener(this);



// Inflate the layout for this fragment
return v;

}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);

}

@Override
public void onDetach() {
super.onDetach();

}

@Override
public void onClick(View v) {
WebshopFragment webshopFragment = new WebshopFragment();
MainFragment mFragment = new MainFragment();
MainActivity mainActivity = null;
if (v.getId() == R.id.buttonWebShop) {
mainActivity.getFt().hide(mFragment);
mainActivity.getFt().show(webshopFragment);

}

}
}

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.04.2015, 19:42:16 via Website

Ich will mich jetzt nicht selber zitieren aber du behandelst die Fragments flasch.Austauschen mit FragmentManager#replace wie ich oben geschrieben habe...
Anders geht das kaum.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Sven R.
  • Forum-Beiträge: 1.904

27.04.2015, 20:20:07 via App

Außerdem kommt die NPE wahrscheinlich daher, das du versuchst auf mainActivity, welche null ist, zuzugreifen. Desweiteren würde man bei der von Pascal beschriebenen Weise, eine Fragment auszutauschen, den ChildFragmentManger nehmen:

getChildFragmentManager()

— geändert am 27.04.2015, 20:20:14

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Sven R.
  • Forum-Beiträge: 1.904

27.04.2015, 22:03:26 via App

Und warum geht es dann nicht? 😂

Wirklich: Du musst das Fragment vor der Benutzung "einbinden". Zum Beispiel mit dem FragmentManager. Davon holst du dir eine FragmentTransaction und machst damit ein replace(), dann commit() und fertig.
Wie fügst du über das jetzige Fragment ein, per XML?

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten