2014-06-19 256 views
1

我已经以编程方式实现了Navigation Drawer。当我点击左上角的图标时屏幕会变暗(当抽屉确实滑入时的动画),但抽屉根本不会滑动,而其他所有功能都可以正常工作。导航抽屉不滑动

这是我的代码。

public class MainActivity extends Activity { 
    private static final String TAG = "MAIN_ACTIVITY"; 
    private DrawerLayout mDrawerLayout; 
    public static ArrayList<String> mOptions=new ArrayList<String>(); 
    // ListView represents Navigation Drawer 
    private ListView mDrawerList; 
    private ActionBarDrawerToggle mDrawerToggle; 
    private CharSequence mTitle; 
    private MainActivityLayout mainActivityLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mainActivityLayout=new MainActivityLayout(this,null); 

     setContentView(mainActivityLayout);//changed this 


     mOptions.add("Search"); 
     mOptions.add("Inbox"); 
     mOptions.add("Shout-A-Loud"); 
     mOptions.add("Saved Profiles"); 
     mOptions.add("Profile viewers");// premium feature. Will display profile views but not viewers. 
     mOptions.add("Settings"); 
     mOptions.add("App Info"); 


     mDrawerLayout=(DrawerLayout) mainActivityLayout;//this changed 
     mDrawerList=(ListView) new ListViewCustom(this,null); 


     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(), 
       R.layout.drawer_list_item, mOptions); 


     mDrawerList.setAdapter(adapter); 
     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 


     mDrawerToggle = new ActionBarDrawerToggle(
       this,      
       mDrawerLayout,   
       R.drawable.ic_drawer, 
       R.string.drawer_open,  
       R.string.drawer_close 
       ) { 
      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view); 
       mTitle="Social Geek"; 
       getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View view) { 
       super.onDrawerOpened(view); 
       mTitle="Select"; 
       getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
     }; 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 




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

    } 

二等

public class MainActivityLayout extends DrawerLayout{ 

static Context context; 
static DrawerLayout DrawerLayoutCustom; 
static ListViewCustom ListViewCustom; 

    public MainActivityLayout(Context context,AttributeSet attr) { 
     super(context,attr); 
     MainActivityLayout.context=context; 
     ListViewCustom=new ListViewCustom(context,null); 

     LayoutParams layoutParams=new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); 
     setLayoutParams(layoutParams); 
     addView(ListViewCustom); 
     initializeEverything(context, null); 

    } 

三等

public class ListViewCustom extends ListView{ 
    static final int LISTVIEW_CUSTOM=0; 
    public ListViewCustom(Context context,AttributeSet attrs) { 
     super(context,attrs); 



     DrawerLayout.LayoutParams layoutParams= 
       new DrawerLayout.LayoutParams(240,LayoutParams.MATCH_PARENT); 
     layoutParams.gravity=Gravity.START; 
     setBackgroundColor(111); 
     setDivider(getResources().getDrawable(android.R.color.transparent)); 
     setChoiceMode(CHOICE_MODE_SINGLE); 
     setLayoutParams(layoutParams); 

    } 
} 

回答

2

我强烈建议创建以.xml自定义布局。 你在做什么错了,你在ListView里面创建DrawerLayout,甚至没有把它添加到任何布局。意思是,你的ListView是父级,而DrawerLayout是子级,这是不正确的。

正确的做法是,DrawerLayout是父ListView孩子。 (意思是说,ListView需要在DrawerLayout中)。

XML例子:

<!--- drawerlayout needed to make it all work --> 
<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"> 

    <!-- The main content view this is where you display your stuff --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <!-- The navigation drawer, this will slide in and out --> 
    <ListView android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#111"/> 

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

看看这里还有: How to create a NavigationDrawer

+0

事情是。我想我的MainActivity的布局是以编程方式创建而不是XML。但是类的嵌套混淆了我。所以我必须创建一个'扩展DrawerLayout'然后'addView()'的每个类的类? –

+0

你甚至不需要扩展DrawerLayout。只需在代码中创建一个DrawerLayout,然后添加FrameLayout(内容框架)和ListView。 –

+0

谢谢菲利普。遵循这最后的建议,我做到了!我做的是 mainActivityLayout = new MainActivityLayout(this,null); mDrawerList = new ListViewCustom(this,null); mDrawerLayout = new DrawerLayout(this); mDrawerLayout.addView(mainActivityLayout); mDrawerLayout.addView(mDrawerList); setContentView(mDrawerLayout) 仍然面临小问题但无后顾之忧,再次感谢 –