首页 >> 大全

从头开始做一个Material Design风格的App(3)

2023-07-21 大全 28 作者:考证青年

3.2添加抽屉导航

添加导航抽屉跟 5.0之前是一样的,只是以前我们使用来作为菜单容器,现在我们则使用 风格的。

(14)在你工程的java文件夹中,创建3个名为、、model的包,将.java移到包中,这样做使得你的代码可以很好地组织和管理。

(15)打开位于app模块下的build.文件并添加如下依赖。添加完依赖之后,点击Build–> 下载所需要的类库

dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support:recyclerview-v7:28.0.+'
}

(16)在model包里,创建名为.java的类,然后添加以下代码。这个模型类是一个简单的POJO(Plain Java 即简单的java对象)类,它定义了导航抽屉的菜单项。

package info.androidhive.materialdesign.model;/*** Created by Ravi on 29/07/15.*/
public class NavDrawerItem {private boolean showNotify;private String title;public NavDrawerItem() {}public NavDrawerItem(boolean showNotify, String title) {this.showNotify = showNotify;this.title = title;}public boolean isShowNotify() {return showNotify;}public void setShowNotify(boolean showNotify) {this.showNotify = showNotify;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}
}

(17)在res–>下,创建一个名为.xml的文件并添加如下代码。这个布局渲染了导航抽屉菜单的每一行,如果你想自定义抽屉菜单项,你需要修改这个布局文件。在这个例子中,它仅包含一个。



(18)下载个人资料图标并将它放入文件夹,这一步是可选的,但是这个图标会在导航抽屉的头部用到。

(19)创建另一个名为.xml的布局文件并添加如下代码。这个布局文件渲染了整个导航抽屉的视图,这个布局包括一个显示个人信息的头部和一个显示列表的。


(20)因为是自定义的,我们还需要一个来渲染自定义的xml布局,所以在包下面,创建一个名为ter.java的类并添加如下代码。这个适配器类了.xml并渲染了抽屉菜单。

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import com.example.wzh.materialdesign.R;
import com.example.wzh.materialdesign.model.NavDrawerItem;import java.util.Collections;
import java.util.List;public class NavigationDrawerAdapter extends RecyclerView.Adapter {List data = Collections.emptyList();private LayoutInflater inflater;private Context context;public NavigationDrawerAdapter(Context context, List data) {this.context = context;inflater = LayoutInflater.from(context);this.data = data;}public void delete(int position) {data.remove(position);notifyItemRemoved(position);}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = inflater.inflate(R.layout.nav_drawer_row, parent, false);MyViewHolder holder = new MyViewHolder(view);return holder;}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {NavDrawerItem current = data.get(position);holder.title.setText(current.getTitle());}@Overridepublic int getItemCount() {return data.size();}class MyViewHolder extends RecyclerView.ViewHolder {TextView title;public MyViewHolder(View itemView) {super(itemView);title = (TextView) itemView.findViewById(R.id.title);}}
}

(21)在包下,创建一个名为.java的。在 里面,按以下操作来创建一个新的,在包上右键–>New–>–>(Blank),然后给命名。

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;import com.example.wzh.materialdesign.R;
import com.example.wzh.materialdesign.adapter.NavigationDrawerAdapter;
import com.example.wzh.materialdesign.model.NavDrawerItem;import java.util.ArrayList;
import java.util.List;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 getData() {List data = new ArrayList<>();// preparing navigation drawer itemsfor (int i = 0; i < titles.length; i++) {NavDrawerItem navItem = new NavDrawerItem();navItem.setTitle(titles[i]);data.add(navItem);}return data;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// drawer labelstitles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflating view layoutView 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() {@Overridepublic void onClick(View view, int position) {drawerListener.onDrawerItemSelected(view, position);mDrawerLayout.closeDrawer(containerView);}@Overridepublic 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) {@Overridepublic void onDrawerOpened(View drawerView) {super.onDrawerOpened(drawerView);getActivity().invalidateOptionsMenu();}@Overridepublic void onDrawerClosed(View drawerView) {super.onDrawerClosed(drawerView);getActivity().invalidateOptionsMenu();}@Overridepublic void onDrawerSlide(View drawerView, float slideOffset) {super.onDrawerSlide(drawerView, slideOffset);toolbar.setAlpha(1 - slideOffset / 2);}};mDrawerLayout.setDrawerListener(mDrawerToggle);mDrawerLayout.post(new Runnable() {@Overridepublic 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() {@Overridepublic boolean onSingleTapUp(MotionEvent e) {return true;}@Overridepublic void onLongPress(MotionEvent e) {View child = recyclerView.findChildViewUnder(e.getX(), e.getY());if (child != null && clickListener != null) {clickListener.onLongClick(child, recyclerView.getChildPosition(child));}}});}@Overridepublic 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;}@Overridepublic void onTouchEvent(RecyclerView rv, MotionEvent e) {}@Overridepublic void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}}public interface FragmentDrawerListener {public void onDrawerItemSelected(View view, int position);}
}

(22)最后打开主的布局文件(.xml)并按下面所示来修改布局。在这个布局里面,我们添加了..v4..来展示导航抽屉菜单。

当然在标签里,你需要给出正确的路径。

material设计风格_



现在所有的布局文件和java类文件都准备到位了,让我们对做一些修改来使导航抽屉工作起来。

(23)打开.java文件并做如下修改。

>实现.er接口并添加()重载。

>创建的实例并设置抽屉选定的侦听器

import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;import com.example.wzh.materialdesign.R;public class MainActivity extends AppCompatActivity implements
FragmentDrawer.FragmentDrawerListener{private Toolbar mToolbar;private FragmentDrawer drawerFragment;@Overrideprotected 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);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main,menu);return true;}@Overridepublic 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 SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}@Overridepublic void onDrawerItemSelected(View view, int position) {}
}

现在如果你运行App,可以看到导航抽屉,在里面有一个头部视图以及一些列表项。

完整Demo作者已经托管在上,可点击这里。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了