如何在没有片段的情况下使用导航抽屉?

Posted

技术标签:

【中文标题】如何在没有片段的情况下使用导航抽屉?【英文标题】:How can I use the Navigation Drawer without fragments? 【发布时间】:2013-05-18 02:59:45 【问题描述】:

我正在尝试关注这个tutorial 关于如何创建导航抽屉,但我不想在用户从抽屉列表中选择一个项目后使用片段来显示新内容。解决此问题的最佳方法是什么? 我正在使用不实现 Fragments 的 API 10。

【问题讨论】:

【参考方案1】:

首先,API 10 可以通过包含 DrawerLayout 的同一 android 支持包访问片段。这已经存在了两年多,如果您不熟悉 Android 在过去两年中的表现,您不应该尝试使用 DrawerLayout 之类的新事物。

其次,DrawerLayout 没有任何东西与片段相关联。引用the Web page that you linked to:

当用户在抽屉列表中选择一个项目时,系统会在给 setOnItemClickListener() 的 OnItemClickListener 上调用 onItemClick()。您在 onItemClick() 方法中执行的操作取决于您实现应用程序结构的方式。

如果你仔细阅读这两个句子,你会发现它们都没有出现“片段”这个词。那是因为DrawerLayout 没有绑定到片段。他们展示的示例代码使用了片段,但这只是示例代码。

因此,欢迎您随心所欲地更新您的 UI:

使用 Android 支持包的片段反向端口执行FragmentTransaction,或 开始一项活动,或 就您现有的活动再次致电setContentView(),或 否则修改现有活动的 UI(例如,隐藏/显示一些小部件)

【讨论】:

有没有办法在活动之间切换并让滑动抽屉随着过渡而平滑消失? 使用片段是更好的解决方案吗?如果您希望在所有应用屏幕中使用操作栏和导航抽屉,您可以避免重新创建它们,不是吗? @kelmer:“使用片段是更好的解决方案吗?” - 这取决于您对“更好”的定义和您的具体用例。例如,如果您希望从应用程序外部进入您的应用程序的多个入口点,那么您很可能需要多个活动。 “您避免重新创建操作栏”——您仍将拥有相同数量的代码,因为您仍然需要定义操作栏以及它如何随着可见片段混合的变化而变化。 “& 导航抽屉”——这可以通过其他重用技术来处理,例如静态辅助方法。 @CoolMind 该项目于 2 年前结束:D @CoolMind 那个看起来也不错。还有一个提示:当抽屉关闭时淡入内容视图(我总是给它 id @+id/content),然后当新活动开始时淡入。这样看起来更好。祝你好运!【参考方案2】:

您也可以使用 LayoutInflater 类。

    创建 xml 布局文件。 使用 findViewById 查找要更改的视图。 使用 .removeAllViews() 方法从找到的视图中删除所有子视图。 使用 .inflate() 方法将 xml 布局内容膨胀到找到的视图中。

这是一个例子:

LinearLayout layoutToChange = (LinearLayout)findViewById(R.id.layout_to_change);
layoutToChange.removeAllViews();

LayoutInflater inflater = LayoutInflater.from(this);
LinearLayout newLayout = (LinearLayout)inflater.inflate(R.layout.new_layout, null);

layoutToChange.addView(newLayout);

【讨论】:

【参考方案3】:

没有片段的基本抽屉

package xxxxxx;


import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;

import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;




public class loginhome extends AppCompatActivity 

    private ListView mDrawerList;
    private DrawerLayout mDrawerLayout;
    private ArrayAdapter<String> mAdapter;
    private ActionBarDrawerToggle mDrawerToggle;
    private String mActivityTitle;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loginhome);
        Toolbar topToolBar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(topToolBar);
        mDrawerList = (ListView)findViewById(R.id.navList);
        mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
        mActivityTitle = getTitle().toString();

        addDrawerItems();
        setupDrawer();


        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

    

    private void addDrawerItems() 
        String[] osArray =  "Android", "ios", "Windows", "OS X", "Linux" ;
        mAdapter = new ArrayAdapter<String>(this, R.layout.drawer_items,R.id.label ,osArray);
        mDrawerList.setAdapter(mAdapter);

        mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
                Toast.makeText(loginhome.this, "Time for an upgrade!", Toast.LENGTH_SHORT).show();
            
        );
    

    private void setupDrawer() 
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) 

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) 
                super.onDrawerOpened(drawerView);
                getSupportActionBar().setTitle("Navigation!");
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) 
                super.onDrawerClosed(view);
                getSupportActionBar().setTitle(mActivityTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            
        ;

        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    

    @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);
        mDrawerToggle.onConfigurationChanged(newConfig);
    

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_help) 
            Toast.makeText(loginhome.this, "setting", Toast.LENGTH_LONG).show();
        
        if(id == R.id.action_place)
            Toast.makeText(loginhome.this, "Refresh App", Toast.LENGTH_LONG).show();
        
        if(id == R.id.action_search)
            Toast.makeText(loginhome.this, "Create Text", Toast.LENGTH_LONG).show();
        
        // Activate the navigation drawer toggle
        if (mDrawerToggle.onOptionsItemSelected(item)) 
            return true;
        

        return super.onOptionsItemSelected(item);
    

drawitems.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_>


        <TextView
            android:id="@+id/label"
            android:layout_
            android:layout_
            android:textColor="#000"
            android:textSize="30sp"
            android:background="#D3D3D3">
        </TextView>
    </LinearLayout>

工具栏.xml

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:background="@color/colorPrimary"
        android:elevation="4dp"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark"


        >

    </android.support.v7.widget.Toolbar>

【讨论】:

【参考方案4】:

使用此代码

private void selectItem(int position) 


    // Locate Position
    switch (position) 
    case 0:
            startActivity(new Intent(this,TEST.class));
        break;

【讨论】:

以上是关于如何在没有片段的情况下使用导航抽屉?的主要内容,如果未能解决你的问题,请参考以下文章

如何在底部导航片段(或导航抽屉)之间传递数据?

如何在导航抽屉中制作另一个项目?

如何在主片段中单击按钮时打开导航抽屉?

如何在导航抽屉中的两个片段之间传递数据

如何在导航抽屉活动模板中的片段之间传递字符串变量

Android - 如何更改导航抽屉中的片段