0

我目前正在開發一個Android應用程序,我使用導航抽屜以及使用viewPager遍歷碎片的滑動手勢。導航抽屜和ViewPager衝突

基本上,我希望用戶能夠使用導航抽屜選擇頁面(片段)並能夠滑動到下一頁(片段)。

我現在的問題是它們重疊。輕掃手勢按預期工作,但當我在導航抽屜中選擇另一個頁面時,它們的底層頁面不會消失。我需要一些「刷新」每個片段。

enter image description here

這是我在MainActivity.java頁

package com.example.home.cloud; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Toast; 

public class MainActivity extends ActionBarActivity implements FragmentDrawer.FragmentDrawerListener { 

    private static String TAG = MainActivity.class.getSimpleName(); 

    private static final int NUM_PAGES = 10; 

    private Toolbar mToolbar; 
    private FragmentDrawer drawerFragment; 

    private ViewPager mPager; 
    private PagerAdapter mPagerAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mPager = (ViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new MyFragmentStatePagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(mPagerAdapter); 

     mToolbar = (Toolbar) findViewById(R.id.toolbar); 

     setSupportActionBar(mToolbar); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 

     drawerFragment = (FragmentDrawer) 
     getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
     drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar); 
     drawerFragment.setDrawerListener(this); 

     // display the first navigation drawer view on app launch 
     displayView(0); 
    } 

    @Override 
    public void onBackPressed() { 
     if (mPager.getCurrentItem() == 0) { 
      super.onBackPressed(); 
     } else { 
      mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
     } 
    } 

    private class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter 
    { 
     public MyFragmentStatePagerAdapter(FragmentManager fm) 
     { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      final Fragment result; 
      switch (position) { 
       case 0: 
        result= new HomeFragment(); 
        break; 
       case 1: 
        result= new OverviewFragment(); 
        break; 
       case 2: 
        result= new BenFragment(); 
        break; 
       case 3: 
        result= new TechFragment(); 
        break; 
       case 4: 
        result= new ArcFragment(); 
        break; 
       case 5: 
        result= new DmodFragment(); 
        break; 
       case 6: 
        result= new SmodFragment(); 
        break; 
       case 7: 
        result= new VirtFragment(); 
        break; 
       case 8: 
        result= new StorageFragment(); 
        break; 
       case 9: 
        result= new SecurityFragment(); 
        break; 
       default: result=null; 
        break; 
      } 
     /* if (result != null) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.container_body, result); 
       fragmentTransaction.commit(); 

      }*/ 
      return result; 

     } 


     @Override 
     public int getCount() { 
      return NUM_PAGES; 
     } 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     if(id == R.id.action_search){ 
      Toast.makeText(getApplicationContext(), "Search action is selected!", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onDrawerItemSelected(View view, int position) { 
     displayView(position); 
    } 

    private void displayView(int position) { 
     Fragment fragment = null; 
     String title = getString(R.string.app_name); 
     switch (position) { 
      case 0: 
       fragment = new HomeFragment(); 
       title = getString(R.string.title_home); 
       break; 
      case 1: 
       fragment = new OverviewFragment(); 
       title = getString(R.string.title_overview); 
       break; 
      case 2: 
       fragment=new BenFragment(); 
       title="Benefits and Risks"; 
       break; 
      case 3: 
       fragment=new TechFragment(); 
       title="Technologies behind Cloud Computing"; 
       break; 
      case 4: 
       fragment = new ArcFragment(); 
       title="Architecture"; 
       break; 
      case 5: 
       fragment= new DmodFragment(); 
       title="Deployment Models"; 
       break; 
      case 6: 
       fragment = new SmodFragment(); 
       title="Service Models"; 
       break; 
      case 7: 
       fragment = new VirtFragment(); 
       title="Virtualization"; 
       break; 
      case 8: 
       fragment = new StorageFragment(); 
       title="Data Storage"; 
       break; 
      case 9: 
       fragment = new SecurityFragment(); 
       title="Security"; 
       break; 
      default: 
       break; 
     } 

     if (fragment != null) { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.container_body, fragment); 
      fragmentTransaction.commit(); 

      // set the toolbar title 
      getSupportActionBar().setTitle(title); 
     } 
    } 
} 
+0

發佈您的'layout.xml'文件。 – Wizard

+0

您正在替換導航項目點擊片段,您必須根據導航項目點擊位置設置viewpager當前項目。 –

回答

2

代碼的麻煩是,你在兩種不同的方式顯示您的片段。您的displayView()方法正在創建新片段並顯示它們,而不是顯示已在ViewPager中加載的片段。要解決此問題,您需要displayView()來替代設置ViewPager的位置。

private void displayView(int position) { 
    mPager.setCurrentItem(position); 
    getSupportActionBar().setTitle(mPagerAdapter.getPageTitle(position)); 
}