簡體   English   中英

從活動類打開Android導航抽屜

[英]Open Android Navigation Drawer from an activity class

我正在使用android Navigation Drawer ,通過其文檔,抽屜只能擴展Fragment Activity,因此要從我的所有活動中打開抽屜,我需要將所有活動都做成一個片段,這不是可行的解決方案。

有沒有辦法打開一個從Activity擴展FragmentActivity的抽屜?

當我嘗試從Activity類擴展抽屜活動,以及另一個將打開擴展抽屜活動類的抽屜的活動(此處為SlideMenuActivity)時,應用程序崩潰,給出NullPointerException。

下面是打開抽屜布局的代碼,但是一旦第一個活動啟動,我將無法訪問抽屜。

應用在onPostCreate方法中的syncState點上崩潰

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onPostCreate(savedInstanceState);
    getActionDrawerToggle().syncState();
}

public class SlideMenuActivity extends FragmentActivity implements OnItemClickListener


{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setDrawerLayout();
        setDrawerList();
        if (savedInstanceState == null) 
        {
            getDrawerListView().setSelectionAfterHeaderView();
            getDrawerListView().setSelection(1);
            selectItem(1);
        }
    }
//  
//  @Override
//  public void setContentView(int layoutResID) {
//      // TODO Auto-generated method stub
//      super.setContentView(layoutResID);
//  }

    private DrawerLayout getDrawerView()
    {
        return (DrawerLayout)findViewById(R.id.drawer_layout);
    }

    private ListView getDrawerListView()
    {
        return (ListView) findViewById(R.id.left_drawer);
    }

    private ActionBarDrawerToggle getActionDrawerToggle()
    {
        ActionBarDrawerToggle drawerToggle=new ActionBarDrawerToggle(
                this,                  /* host Activity */
                getDrawerView(),         /* 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) {
               super.onDrawerClosed(view);
            }

            @Override
            public void onDrawerOpened(View view) {
                super.onDrawerOpened(view);
            }
        };
        return drawerToggle;
    }

    private void setDrawerLayout(){
        // set a custom shadow that overlays the main content when the drawer opens
        getDrawerView().setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK);
        // enable ActionBar app icon to behave as action to toggle navigation drawer
        getDrawerView().setDrawerListener(getActionDrawerToggle());

    }

    /**
     *  Set up the drawer's list view with items and click listener
     */
    private void setDrawerList()
    {
        ImageView imageView=new ImageView(this);
        imageView.setImageDrawable(getResources().getDrawable(R.drawable.precision_logo));
        CustomBaseAdapter adapter=new CustomBaseAdapter();
        adapter.list=getListViewData();
        adapter.context=this;
        ListView drawerList=getDrawerListView();
        drawerList.setHeaderDividersEnabled(true);
        drawerList.addHeaderView(imageView, null, false);
        drawerList.setScrollingCacheEnabled(false);
        drawerList.setAdapter(adapter);
        drawerList.setOnItemClickListener(this);

    }

    private void selectItem(int position){

         // update the main content by replacing fragments

//        Fragment fragment=null;
//      FragmentManager manager=getSupportFragmentManager();
        switch (position) {
        case 1:
            this.startActivity(new Intent(this,SavedTankListActivity.class));
//          fragment = new SavedMixesFragment();
//          fragment = new SavedTankListActivity();
//          manager.beginTransaction().replace(R.id.content_frame, fragment).commit();
            break;

        case 2:
//          fragment=new MixGuideFragment();
//          manager.beginTransaction().replace(R.id.content_frame, fragment).commit();
            break;

        default:
//          fragment = new SavedMixesFragment();
//          manager.beginTransaction().replace(R.id.content_frame, fragment).commit();

            break;
        }

        getDrawerView().closeDrawer(getDrawerListView());

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onPostCreate(savedInstanceState);
        getActionDrawerToggle().syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
        getActionDrawerToggle().onConfigurationChanged(newConfig);
    }

    private ArrayList<DrawerListModel> getListViewData()
    {
        ArrayList<DrawerListModel> listViewData=new ArrayList<DrawerListModel>();
        String[] listItemArray=getResources().getStringArray(R.array.slide_bar_list_item_array);
        for(int index=0;index<listItemArray.length;index++)
        {
            DrawerListModel model=new DrawerListModel();
            model.listItem=listItemArray[index];
            listViewData.add(model);
        }
        return listViewData;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id)
    {
        view.setSelected(true);
        selectItem(position); 
    }

    public void openDrawerList(View view){
        getDrawerView().openDrawer(getDrawerListView());
    }
}

我也正在瀏覽文檔,並認為我必須將所有活動分解為片段。 只是為了清除它,事實並非如此。 您可以在線性布局下放置任意數量的元素,也可以根據需要添加任何元素。

例如,如果您沒有appdrawer的基本活動是:

<RelativeLayout>
   <TextView>
   </TextView>
   <Button>
   <Button>
</RelativeLayout>

簡單地做

<android.support.v4.widget.DrawerLayout>

    <RelativeLayout>
       <TextView>
       </TextView>
       <Button>
       <Button>
    </RelativeLayout>

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

假設您可以在主活動中放置導航抽屜,所有子活動類都可以使用該抽屜,但是我不明白的是如何避免為所有子活動重復包含抽屜的布局。

導航抽屜不需要成碎片。 您可以創建一個類,然后將其從所有活動中擴展出來(就像您嘗試做的那樣)。

public class SlideMenuActivity extends Activity{..}

您的主要活動看起來像

public class MainActivity extends SlideMenuActivity{..}

可以按照創建導航活動中所述的相同方法來實現SlideMenuActivity。

您的所有XML頁面都將包含以下內容:

<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:background="#FFFFFF" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

</LinearLayout>

<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="#CCCCCC"
    android:dividerHeight="1dp" />

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

在沒有看到logcat輸出的情況下,我不確定為什么會收到錯誤,但是希望這可以幫助您了解更多的導航抽屜代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM