【问题标题】:How to Disable material design Fragment Navigation Drawer inside a particular Activity如何在特定活动中禁用材料设计片段导航抽屉
【发布时间】:2015-10-15 14:53:50
【问题描述】:

我在我的应用程序中使用了 Fragment Navigation Drawer 和 FloatingActionButton。单击 FloatingActionButton 会将我带到新活动。现在我添加了 setDisplayHomeAsUpEnabled(true) 并将我带到父活动。但是在这个活动中,我仍然可以滑动 Fragment Navigaion Drawer,当我点击抽屉项目应用程序崩溃时。我想在第二个活动中禁用片段导航抽屉。我该怎么做。这是我的代码。

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    drawerFragment = (FragmentDrawer)
            getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
    drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar);
    drawerFragment.setDrawerListener(this);

    ImageView imageView = new ImageView(this);
    imageView.setImageResource(R.mipmap.icon_launcher);

    FloatingActionButton actionButton = new FloatingActionButton.Builder(this).setContentView(imageView).build();
    actionButton.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    Intent intent = new Intent(this,AddTopicActivity.class);
    startActivity(intent);
}

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">


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

    <LinearLayout
        android:id="@+id/container_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />


    </LinearLayout>

    <FrameLayout
        android:id="@+id/container_body"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />`


</LinearLayout>


<fragment
    android:id="@+id/fragment_navigation_drawer"
    android:name="mobi.com.swachapp.FragmentDrawer"
    android:layout_width="@dimen/nav_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:layout="@layout/fragment_navigation_drawer"
    tools:layout="@layout/fragment_navigation_drawer" />


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

FragmentDrawer.java

public class FragmentDrawer extends Fragment {

private static String TAG = FragmentDrawer.class.getSimpleName();

private RecyclerView recyclerView;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private NavigationDrawerAdapter adapter;
private View containerView;
private static String[] titles = null;
private FragmentDrawerListener drawerListener;

public FragmentDrawer() {

}

public void setDrawerListener(FragmentDrawerListener listener) {
    this.drawerListener = listener;
}

public static List<NavDrawerItem> getData() {
    List<NavDrawerItem> data = new ArrayList<>();

    int[] icons = {R.drawable.home_icon,R.drawable.usersignin,R.drawable.savedarticles,R.drawable.addtopic,R.drawable.trending,R.drawable.photography,R.drawable.photos,R.drawable.video,R.drawable.survey};
   // preparing navigation drawer items
    for (int i = 0; i < titles.length && i < icons.length; i++) {
        NavDrawerItem navItem = new NavDrawerItem();
        navItem.setTitle(titles[i]);
        navItem.IconId = icons[i];
        data.add(navItem);
    }
    return data;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // drawer labels
    titles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflating view layout
    View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);

    adapter = new NavigationDrawerAdapter(getActivity(), getData());
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {
            drawerListener.onDrawerItemSelected(view, position);
            mDrawerLayout.closeDrawer(containerView);
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

    return layout;
}


public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar) {
    containerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            toolbar.setAlpha(1 - slideOffset / 2);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

}

public static interface ClickListener {
    public void onClick(View view, int position);

    public void onLongClick(View view, int position);
}

static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private ClickListener clickListener;

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }
}

public interface FragmentDrawerListener {
    public void onDrawerItemSelected(View view, int position);
}
}

AddTopicActivity.java

public class AddTopicFragment extends ActionBarActivity {

private Toolbar mToolbar;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ma);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

}

}

我希望当此活动启动时,片段导航抽屉功能将完全禁用。我可以删除抽屉图标,但是当我从左侧抽屉滑动时仍然会进入图片。

谢谢。

【问题讨论】:

  • 但是为什么在项目创建时选择导航活动?
  • 抱歉,我没明白你想说什么?
  • 我看到您对这两个活动使用相同的布局文件 R.layout.activity_main.. 这样做有什么理由吗?
  • 好的,我明白了,这是错误的。谢谢
  • 没问题..快乐编码! :)

标签: android navigation-drawer material-design


【解决方案1】:

AddTopicActivity 第二个活动中添加。它会锁定滑动

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

解锁

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

【讨论】:

  • 我使用 Fragment 的自定义抽屉布局,代码显示在 FragmentDrawer,java 类中。并通过添加这些行应用程序崩溃。
  • 可能是mDrawerLayoutnull 你必须让static 在其他活动中访问
  • 是的,我将 mDrawerLayout 设为静态,现在应用程序不会崩溃,但抽屉仍然可以访问
  • FragmentDrawer.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
  • 我刚刚在 FragmentDrawer.java 中创建了一个新函数 public void DisableDrawerLayout() { if(mDrawerLayout!= null) { Log.i("DrawerLayout","NotNull"); mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); }} 并在 AddTopicActivity.java 中调用它我可以看到该函数被调用但导航抽屉仍然存在
猜你喜欢
  • 1970-01-01
  • 2016-08-30
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多