2013-10-22 57 views
21

我想在同一活動中實現兩個導航抽屜和查看傳呼機。導航抽屜工作正常,但視圖分頁器不工作,也是當我打開導航抽屜時右邊滑動空指針(空指針在android。支持.v4。小部件。DrawerLayout。isContentView(DrawerLayout.java:840)。I是安裝在主XML佈局和下面的代碼。 導航抽屜和查看傳呼機在同一活動

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
</android.support.v4.view.ViewPager> 

<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" >  
    <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> 

活性類如下

public class MainActivity extends Activity { 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 

private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private String[] mPlanetTitles; 
private MainActivity mContext; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mContext = this; 
    ViewPager vp = (ViewPager) findViewById(R.id.viewpager); 
    CustomPagerAdapter adapter = new CustomPagerAdapter(mContext); 
    vp.setAdapter(adapter); 
    vp.setPageTransformer(false, new ViewPager.PageTransformer() { 

     @Override 
     public void transformPage(View page, float position) { 
      final float normalizedposition = Math.abs(Math.abs(position) - 1); 
      page.setScaleX(normalizedposition/2 + 0.5f); 
      page.setScaleY(normalizedposition/2 + 0.5f); 
     } 
    }); 

    mTitle = mDrawerTitle = getTitle(); 
    mPlanetTitles = getResources().getStringArray(R.array.planets_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 
            */ 
      ) { 
       @Override 
       public void onDrawerClosed(View view) { 
        getActionBar().setTitle(mTitle); 
        invalidateOptionsMenu(); // creates call to 
              // onPrepareOptionsMenu() 
       } 

       @Override 
       public void onDrawerOpened(View drawerView) { 
        getActionBar().setTitle(mDrawerTitle); 
        invalidateOptionsMenu(); // creates call to 
              // onPrepareOptionsMenu() 
       } 

      }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     selectItem(0); 
    } 
} 

@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); 
    return super.onPrepareOptionsMenu(menu); 
} 

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

/* 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) { 

    // update selected item and title, then close the drawer 
    mDrawerList.setItemChecked(position, true); 
    setTitle(mPlanetTitles[position]); 
    mDrawerLayout.closeDrawer(mDrawerList); 
} 

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

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

public class CustomPagerAdapter extends PagerAdapter { 

    private Context context; 

    int index = 2; 

    // public CustomPagerAdapter(Context context, Vector<View> pages) { 
    // this.context = context; 
    // this.pages = pages; 
    // } 

    public CustomPagerAdapter(Context context) { 
     this.context = context; 
     this.index = 2; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     LayoutInflater inflater = (LayoutInflater.from(container.getContext())); 
     // View page = pages.get(position); 
     View view = null; 
     if (position == 0) { 
      view = inflater.inflate(R.layout.page_one_views, null); 
      ((ViewPager) container).addView(view); 

     } 
     else { 
      // page.setBackgroundColor(colors.get(position)); 
      // container.addView(page); 
      view = inflater.inflate(R.layout.page_two, null); 
      ((ViewPager) container).addView(view); 
     } 
     return view; 
    } 

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

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view.equals(object); 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View) object); 
    } 

} 

}

給出

請幫幫我。在此先感謝

+1

相信drawerlayout必須是根元素。嘗試將ViewPager插入其中 –

回答

29

DrawerLayout應該是根元素。把ViewPager放在裏面。

<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"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <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> 
7
<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" > 

<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.view.ViewPager> 

<ListView 
    android:id="@+id/left_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:layout_below="@+id/top_bar" 
    android:background="@android:color/darker_gray" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/background_dark" 
    android:dividerHeight="1dp" /> 

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

抽屜在此處不可見 – Sujay

0

爲了實現這樣的事情:

enter image description here

使用簡單:

<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" >  

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay"/> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/viewpager" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" > 
     </android.support.v4.view.ViewPager> 

     <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>