Fragment verschwindet beim zweiten Aufruf // Navigation Drawer mit TabLayout

  • Antworten:2
user349582
  • Forum-Beiträge: 13

23.07.2016, 22:18:38 via Website

Hallo Community,

ich habe einen Navigation Drawer (den Standard Drawer von Google, welchen man vorgefertigt bei Android Studio bekommt) mit mehreren Fragments und ein TabLayout mit einem ViewPager. Das TabLayout und der ViewPager sind ebenfalls in einem Fragment. Die normalen Fragments werden problemlos ausgetauscht. Doch das tauschen zwischen einen normalen Fragment mit dem TabLayout und dem View Pager funktioniert nicht. Der ViewPager ist dann leer und das wischen in das nächste Fragment geht nicht mehr.

Leider finde ich den Fehler nicht. Hat jmd. eine Idee, was ich falsch mache?

Vielen Dank im Vorraus. :)

XML:Fragment mit TabLayout und ViewPager:

<RelativeLayout xmlns:android="---"
xmlns:tools="---"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="---"
tools:context="---">

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMode="fixed"
    app:tabGravity="fill"
    android:background="#1565C0"
    android:textColor="#fff" />

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_below="@+id/tabs" />

Java: Fragment mit TabLayout und ViewPager:

public class Startseite extends Fragment {

private TabLayout tabLayout;
private ViewPager viewPager;
WebView webView;


public Startseite() {

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

    return inflater.inflate(R.layout.fragment_startseite, container, false);
}

public void onViewCreated(View view, Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);


    viewPager = (ViewPager) view.findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) view.findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.setTabTextColors(ColorStateList.valueOf(Color.WHITE));
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
    adapter.addFragment(new Neu(), "NEU");
    adapter.addFragment(new Wichtig(), "WICHTIG");
    adapter.addFragment(new News(), "NEWS");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

XML:Erstes Fragment im ViewPager:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="---"
xmlns:tools="---"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="---"
android:id="@+id/swipe_container_neu">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView_neu"
        android:layout_gravity="center" />

JAVA:Erstes Fragment im ViewPager:

public class Neu extends Fragment {
WebView webView;
SwipeRefreshLayout swipeLayout;
ProgressBar spinner;

public Neu() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_neu, container, false);

    webView = (WebView) view.findViewById(R.id.webView_neu);
    webView.loadUrl("---");
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebViewClient(new WebViewClient() {
        public boolean shouldOverrideUrlLoading(WebView viewx, String urlx) {
            viewx.loadUrl(urlx);
            return false;

        }
    });

    webView.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
                webView.goBack();
                return true;
            }

            return false;
        }
    });

    swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container_neu);
    swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {

            webView.reload();

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    swipeLayout.setRefreshing(false);
                }
            }, 5000);

        }

    });

    return view;

}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

}

XML:Normales Fragment im NavDrawer:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="---"
xmlns:tools="---"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="---"
android:id="@+id/swipe_container_deutsch">

<WebView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/webView_deutsch"         />

JAVA:Normales Fragment im NavDrawer:

public class Deutsch extends Fragment {

WebView webView;
SwipeRefreshLayout swipeLayout;


public Deutsch() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_deutsch, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    webView = (WebView) view.findViewById(R.id.webView_deutsch);
    webView.loadUrl("---");
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebViewClient(new WebViewClient() {
        public boolean shouldOverrideUrlLoading(WebView viewx, String urlx) {
            viewx.loadUrl(urlx);
            return false;

        }
    });

    webView.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
                webView.goBack();
                return true;
            }

            return false;
        }
    });

    swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container_deutsch);
    swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {

            webView.reload();

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    swipeLayout.setRefreshing(false);
                }
            }, 5000);

        }

    });
}

MainActivity:

public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    if (findViewById(R.id.fragment_container) != null) {

        if (savedInstanceState != null) {
            return;
        }
    }

    Startseite firstFragment = new Startseite();

    getSupportFragmentManager().beginTransaction()
            .add(R.id.fragment_container, firstFragment).commit();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }

...

 public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_start) {
        Startseite newFragment = new Startseite();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);

        transaction.commit();

...

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

— geändert am 23.07.2016, 23:07:33

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

24.07.2016, 10:20:00 via App

Fragments schschteln macht keinen Sinn und funkitioniert auch nicht zuverlässig.
Mach eine Activity welche ViewPager TabLayout und die Fragments steuert dann geht es.

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

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

25.07.2016, 09:22:42 via Website

Hier ist Dein Problem

ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());

Versuche stattdessen das hier

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());

Außerdem kannst Du mit

adapter.setOffscreenPageLimit(int)

die Zahl der Seiten im Pager setzen, die gecached werden. Setze den Wert auf die Zahl der Seiten, die du insgesamt hast und sie werden nicht jedes mal neu aufgebaut, wenn sie sichtbar werden.

— geändert am 25.07.2016, 09:24:45

user349582

Antworten