1

我想在同一个活动中使用NavigationDrawer和ViewPager,但它无法正常工作。我正在关注developer google tutorial我希望有三个选项卡,如果选中它们,每个选项卡都将显示一个不同的ExpandableList。目前我得到的NavigationDrawer和ExpandableList工作正常,但TabBar和de ViewPager不管理滑动和点击事件。如何在Android中使用带有NavigationDrawer的ViewPager

任何人都可以帮助我吗?我一直在阅读和寻找年龄!

我的主要活动HomeActivity是这样的:

public class HomeActivity extends FragmentActivity implements ActionBar.TabListener{ 
    // ExpandableList 
    private ArrayList<String> parentItems = new ArrayList<>(); 
    private ArrayList<Object> childItems = new ArrayList<>(); 

    // SlideMenu 
    private String[] mPlanetTitles; 
    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private CharSequence mDrawerTitle; 
    private CharSequence mTitle; 
    private ActionBarDrawerToggle mDrawerToggle; 

    // Declaraciones Pager 
    AppSectionsPagerAdapter mAppSectionsPagerAdapter; 
    ViewPager mViewPager; 


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

     ///// EXPANDABLELISTVIEW PART ///// 
     ExpandableListView expandableList = (ExpandableListView) findViewById(R.id.expandableListView1); 
     expandableList.setGroupIndicator(null); 
     expandableList.setClickable(true); 
     setGroupParents(); 
     setChildData(); 
     MyExpandableAdapter adapter = new MyExpandableAdapter(parentItems, childItems); 
     adapter.setInflater((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), this); 
     expandableList.setAdapter(adapter); 
     expandableList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
       return false; 
      } 
     }); 

     /////// ACTIONBAR PART/////////// 
     ActionBar mActionBar = getActionBar(); 
     mActionBar.setDisplayShowHomeEnabled(false); 
     mActionBar.setDisplayShowTitleEnabled(false); 
     LayoutInflater mInflater = LayoutInflater.from(this); 
     View mCustomView = mInflater.inflate(R.layout.custom_actionbar, null); 
     TextView mTitleTextView = (TextView) mCustomView.findViewById(R.id.title_text); 
     mTitleTextView.setText("Título"); 
     mActionBar.setCustomView(mCustomView); 
     mActionBar.setDisplayShowCustomEnabled(true); 

     /////// NAVIGATION DRAWER PART//////// 
     mTitle = mDrawerTitle = getTitle(); 
     mPlanetTitles = getResources().getStringArray(R.array.prueba_array); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView) findViewById(R.id.left_drawer); 

     // set a custom shadow that overlays the main content when the drawer opens 
     mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 
     // set up the drawer's list view with items and click listener 
     mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
       R.layout.drawer_list_item, mPlanetTitles)); 
     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     // enable ActionBar app icon to behave as action to toggle nav drawer 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 

     // ActionBarDrawerToggle ties together the the proper interactions 
     // between the sliding drawer and the action bar app icon 
     mDrawerToggle = new ActionBarDrawerToggle(
       this,     /* host Activity */ 
       mDrawerLayout,   /* DrawerLayout object */ 
       R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ 
       R.string.drawer_open, /* "open drawer" description for accessibility */ 
       R.string.drawer_close /* "close drawer" description for accessibility */ 
     ) { 
      public void onDrawerClosed(View view) { 
       //getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 

      public void onDrawerOpened(View drawerView) { 
       //getActionBar().setTitle(mDrawerTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
     }; 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
//  if (savedInstanceState == null) { 
//   selectItem(0); 
//  } 

     ////////////PART VIEWPAGER/////////////// 

     // Create the adapter that will return a fragment for each of the three primary sections 
     // of the app. 
     mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); 

     // Set up the action bar. 
     final ActionBar actionBar = getActionBar(); 

     // Specify that the Home/Up button should not be enabled, since there is no hierarchical 
     // parent. 
     actionBar.setHomeButtonEnabled(false); 

     // Specify that we will be displaying tabs in the action bar. 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Set up the ViewPager, attaching the adapter and setting up a listener for when the 
     // user swipes between sections. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mAppSectionsPagerAdapter); 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       // When swiping between different app sections, select the corresponding tab. 
       // We can also use ActionBar.Tab#select() to do this if we have a reference to the 
       // Tab. 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) { 
      // Create a tab with text corresponding to the page title defined by the adapter. 
      // Also specify this Activity object, which implements the TabListener interface, as the 
      // listener for when this tab is selected. 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mAppSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(this)); 
     } 

    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 


    /* Called whenever we call invalidateOptionsMenu() */ 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // If the nav drawer is open, hide action items related to the content view 
     //boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
     //menu.findItem(R.id.action_websearch).setVisible(!drawerOpen); 
     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu items for use in the action bar 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_home, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     //boolean res = false; 
     // The action bar home/up action should open or close the drawer. 
     // ActionBarDrawerToggle will take care of this. 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 

     switch (item.getItemId()) { 
      case R.id.add: 
       Toast.makeText(this, "add element", Toast.LENGTH_LONG).show(); 
       break; 
      case R.id.search: 
       Toast.makeText(this, "search a text", Toast.LENGTH_LONG).show(); 
       break; 
      case R.id.edit: 
       Toast.makeText(this, "edit a element", Toast.LENGTH_LONG).show(); 
       break; 
      case R.id.delete: 
       Toast.makeText(this, "delete a element", Toast.LENGTH_LONG).show(); 
       break; 
      case R.id.action_settings: 
       Toast.makeText(this, "acction settings", Toast.LENGTH_LONG).show(); 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /* The click listner for ListView in the navigation drawer */ 
    private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      selectItem(position); 
     } 
    } 

    private void selectItem(int position) { 
     //TODO 
     switch (position) { 
      case 0: 
       Toast.makeText(this, "elemento 0", Toast.LENGTH_LONG).show(); 
       break; 
      case 1: 
       Toast.makeText(this, "elemento 1", Toast.LENGTH_LONG).show(); 
       break; 
      case 2: 
       Toast.makeText(this, "elemento 2", Toast.LENGTH_LONG).show(); 
       break; 

     } 

    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Pass any configuration change to the drawer toggls 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 


    public void setGroupParents() { 
     parentItems.add("Androwwid"); 
     parentItems.add("Core Java"); 
     parentItems.add("Desktop Java"); 
     parentItems.add("Enterprise Java"); 
    } 

    public void setChildData() { 

     // Android 
     ArrayList<String> child = new ArrayList<>(); 
     child.add("Core"); 
     child.add("Games"); 
     childItems.add(child); 

     // Core Java 
     child = new ArrayList<>(); 
     child.add("Apache"); 
     child.add("Applet"); 
     child.add("AspectJ"); 
     child.add("Beans"); 
     child.add("Crypto"); 
     childItems.add(child); 

     // Desktop Java 
     child = new ArrayList<>(); 
     child.add("Accessibility"); 
     child.add("AWT"); 
     child.add("ImageIO"); 
     child.add("Print"); 
     childItems.add(child); 

     // Enterprise Java 
     child = new ArrayList<>(); 
     child.add("EJB3"); 
     child.add("GWT"); 
     child.add("Hibernate"); 
     child.add("JSP"); 
     childItems.add(child); 
    } 

    public static class AppSectionsPagerAdapter extends FragmentPagerAdapter { 

     public AppSectionsPagerAdapter(android.support.v4.app.FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int i) { 
      switch (i) { 
       case 0: 
        // The first section of the app is the most interesting -- it offers 
        // a launchpad into the other demonstrations in this example application. 
        return new DummySectionFragment(); 

       default: 
        // The other sections of the app are dummy placeholders. 
        Fragment fragment = new DummySectionFragment(); 
        Bundle args = new Bundle(); 
        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1); 
        fragment.setArguments(args); 
        return fragment; 
      } 
     } 

     @Override 
     public int getCount() { 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return "Section " + (position + 1); 
     } 
    } 
    public static class DummySectionFragment extends Fragment { 

     public static final String ARG_SECTION_NUMBER = "section_number"; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_section_dummy, container, false); 
      Bundle args = getArguments(); 
//   ((TextView) rootView.findViewById(android.R.id.text1)).setText(
//     getString(R.string.dummy_section_text, args.getInt(ARG_SECTION_NUMBER))); 
      return rootView; 
     } 
    } 
} 

我activity_home.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 


    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <fragment 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:name="com.example.julio.listviewactionbar.Fragment_A" 
      android:id="@+id/fragment_explist" 
      android:layout_centerVertical="true" 
      android:layout_centerHorizontal="true" 
      tools:layout="@layout/fragment_explistview" /> 

     <ListView 
      android:id="@+id/left_drawer" 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:background="#111" 
      android:choiceMode="singleChoice" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="0dp" /> 

    </android.support.v4.widget.DrawerLayout> 

</RelativeLayout> 

回答

0

我觉得你的问题是,DrawerLayout从viewpager偷接触。当你滑动DrawerLayout而不是viewpager移动?

如果是这种情况,那么您需要扩展DrawerLayout并忽略触摸或扩展viewpager并请求它的父级不禁止触摸事件。

这里是什么,我认为你正在试图做的,但与viewpagers内viewpagers一个例子: https://github.com/willowtreeapps/OAK/blob/master/oak-demos/src/oak/demo/widget/ParentSwipingViewPagerActivity.java

https://github.com/willowtreeapps/OAK/blob/master/oak-library/src/main/java/oak/widget/ParentSwipingViewPager.java

1

更改activity_home.xml如下

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <android.support.v4.view.ViewPager 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <fragment 
      android:id="@+id/fragment_explist" 
      android:name="com.example.julio.listviewactionbar.Fragment_A" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      tools:layout="@layout/fragment_explistview" /> 
    </FrameLayout> 

    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="#111" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" /> 

</android.support.v4.widget.DrawerLayout> 

在片段中使用ViewPager逻辑

+0

我已经使用你的代码,但膨胀其他布局,因为现在的问题是ExpandableListView。我无法在ViewPager中显示它,并且我不知道如何设置适配器的数据。 – juliocb92

+0

其中是activity_home中的R.id.expandableListView1? –

相关问题