2014-06-19 2 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); 

    } 

3 등은

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에서 사용자 정의 레이아웃을 만드는 것이 좋습니다. 당신이 잘못하고있는 것은 DrawerLayoutListView 안에 만들고 레이아웃에 추가하지 않는다는 것입니다. 즉, 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

Philipp 감사합니다. 이 마지막 조언을 따라 나는 그것을 일하게 만들었다! 내가 한 일은 mainActivityLayout = new MainActivityLayout (this, null); mDrawerList = 새 ListViewCustom (this, null); mDrawerLayout = 새로운 DrawerLayout (this); mDrawerLayout.addView (mainActivityLayout); mDrawerLayout.addView (mDrawerList); setContentView (mDrawerLayout) 여전히 사소한 문제가 있지만 걱정하지 않으셔서 다시 한 번 감사드립니다. –