android - 哪个是创建自定义导航抽屉并在运行时添加项目的最佳方法?
问题描述
我正在尝试创建一个自定义导航抽屉。我正在使用 mikepenz 抽屉,但它有很多错误。我无法使用 Android 提供的导航抽屉,因为我在运行时添加菜单项。菜单项作为对象添加,这些对象是在成功登录后从 XML 文件创建的。有没有其他方法可以实现这一目标?
Mikepenz 材料抽屉在 API 28 中崩溃
解决方案
检查下面的例子。
创造activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/layout_drawer"
android:layout_width="250dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#000">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:overScrollMode="never" />
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
</RelativeLayout>`
之后创建MainActivity.java
`public class MainActivity extends AppCompatActivity {
private RecyclerView rvDrawer;
private DrawerAdapter adDrawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<DrawerModel> alDrawerData = new ArrayList<>();
alDrawerData.add("add runtime data her")// added runtime data in this arraylist.
rvDrawer = findViewById(R.id.rv_drawer);
rvDrawer.setLayoutManager(new LinearLayoutManager(this));
adDrawer = new DrawerAdapter();
rvDrawer.setAdapter(adDrawer);
adDrawer.addDrawerData(alDrawerData);
}
}
像这样创建模型类
DrawerModel.java
。
public class DrawerItem {
private String label;
private int imageId;
public DrawerItem(String label, int imageId) {
this.label = label;
this.imageId = imageId;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public int getImageId() {
return imageId;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
}
现在,你像这样的适配器类
DrawerAdapter.java
public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.VHDrawer> {
private Context mContext;
private ArrayList<DrawerItem> alDrawerData;
private DrawerAdapter.OnItemClickListener onItemClickListener;
private String userName;
public DrawerAdapter(Context context) {
this.mContext = context;
alDrawerData = new ArrayList<>();
this.onItemClickListener = onItemClickListener;
}
public String getItem(int position) {
return alDrawerData.get(position).getLabel();
}
@Override
public DrawerAdapter.VHDrawer onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.lay_drawer_item, parent, false);
return new DrawerAdapter.VHDrawer(view);
}
@Override
public void onBindViewHolder(DrawerAdapter.VHDrawer holder, int position) {
DrawerItem drawerItem = alDrawerData.get(position);
holder.imgDrawer.setImageResource(drawerItem.getImageId());
holder.tvDrawer.setText(drawerItem.getLabel());
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemCount() {
return alDrawerData.size();
}
public void addDrawerData(ArrayList<DrawerItem> alDrawerData) {
this.alDrawerData = alDrawerData;
this.notifyDataSetChanged();
}
public interface OnItemClickListener {
void onItemClick(int position);
}
class VHDrawer extends RecyclerView.ViewHolder {
@BindView(R.id.imgDrawer)
ImageView imgDrawer;
@BindView(R.id.txtDrawer)
TextView tvDrawer;
public VHDrawer(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(v -> {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(getAdapterPosition());
}
});
}
}
}
现在创建您的抽屉项目布局文件lay_drawer_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/imgDrawer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:contentDescription="@string/app_name"
android:src="@drawable/dashboard" />
<TextView
android:id="@+id/txtDrawer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:textColor="@android:color/white"
android:textSize="15sp" />
</LinearLayout>
</RelativeLayout>
如果有任何问题请告诉我。
推荐阅读
- c# - 当另一个 Texblock 值更改时更改 Texblock 样式
- python - 我在抓取第二个元素时遇到了一些问题
- mysql - 使用多对多关系从 MySQL 表中删除重复项
- javascript - 将 .env 常量传递给内部目录
- functional-programming - 为什么 ocaml 有可变数组?
- python - sklearn:使用 Pipeline 和 TransformedTargetRegressor 缩放 x(数据)和 y(目标)
- reactjs - 谷歌分析会话管理在不同选项卡中的同一应用程序,在一个反应应用程序中
- asp.net-core - Linux Ubuntu 上生产中的 Microsoft.Extensions.Logging.Log4Net 问题
- javascript - 如何在平面列表中仅渲染一次特定元素 - React Native
- java - 从 jmeter 中的 JSON 请求有效负载生成 HMAC sha256