如何让 Spinner 像 Gmail 应用程序一样在导航抽屉内将项目显示为列表?
How to make Spinner show items as List inside of Navigation Drawer like in Gmail app?
我想制作一个功能与 Gmail 应用程序相同的 Spinner。
具体而言,微调器应在单击时将 NavigationDrawer
的菜单项替换为项目列表。我想我应该使用 ListView
但不知道将它放在哪里以及如何用它动态替换菜单项。
我怎样才能实现这个功能?提前致谢!
可能您正在寻找这样的东西
在你里面activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Spinner element
Spinner spinner = (Spinner) findViewById(R.id.spinner);
// Spinner click listener
spinner.setOnItemSelectedListener(this);
// Spinner Drop down elements
List<String> categories = new ArrayList<String>();
categories.add("Automobile");
categories.add("Business Services");
categories.add("Computers");
categories.add("Education");
categories.add("Personal");
categories.add("Travel");
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, categories);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// On selecting a spinner item
String item = parent.getItemAtPosition(position).toString();
// Showing selected spinner item
Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
在activity.xml
<Spinner
android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/spinner_title"/>
有关完整教程,请参阅此站点 android Spinners
您不应该使用 Spinner。只需使用其他元素即可实现相同的行为。您只需更改其适配器即可更改列表内容。
你可以在官方文档中看到很好的例子:https://developer.android.com/training/implementing-navigation/nav-drawer.html
您可以使用这个不错的库,它可以为您完成所有这些事情。
首先感谢大家的回答!感谢您的帮助!
事实证明,使用 ImageView
和 TextView
并在最后设置 onClickListener
而不是 Spinner
是实现所需功能的更简单方法。在单击事件中,我只是隐藏菜单项并使嵌套在 NavigationView
内的 ListView
可见。生成的代码如下所示:
activity_main.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/header"
layout="@layout/nav_header_main" />
<ListView
android:id="@+id/citiesListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@null"
android:dividerHeight="0dp"
android:listSelector="@android:color/transparent"
android:paddingTop="8dp" />
</LinearLayout>
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
结果:
nav_header_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:paddingBottom="8dp"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/app_name"
android:textColor="@android:color/white"
android:textSize="25sp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:paddingBottom="10dp"
android:paddingTop="10dp">
<TextView
android:id="@+id/cityPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Astana"
android:textSize="15sp" />
<ImageView
android:id="@+id/pickerArrow"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginEnd="30dp"
android:layout_marginRight="30dp" />
</RelativeLayout>
</RelativeLayout>
结果:
主要活动:
// ................
private NavigationView navigationView;
private TextView cityPickerTextView;
private ListView citiesListView;
private ImageView pickerArrow;
private boolean isPickerShown = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ................
findViewById(R.id.header).setVisibility(View.INVISIBLE);
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.inflateHeaderView(R.layout.nav_header_main);
cityPickerTextView = (TextView) headerView.findViewById(R.id.cityPicker);
cityPickerTextView.setText(cities[0]);
cityPickerTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleMenu();
}
});
cityPickerTextView.bringToFront();
pickerArrow = (ImageView) headerView.findViewById(R.id.pickerArrow);
pickerArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
citiesListView = (ListView) findViewById(R.id.citiesListView);
citiesListView.setVisibility(View.INVISIBLE);
final CityPickerAdapter adapter = new CityPickerAdapter(this, cities, userCity);
citiesListView.setAdapter(adapter);
citiesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
userCity = cities[i];
cityPickerTextView.setText(userCity);
adapter.updateCurrentCity(userCity);
}
});
}
private void toggleMenu() {
if (!isPickerShown) {
pickerArrow.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
setMenuItemsVisible(false);
citiesListView.setVisibility(View.VISIBLE);
isPickerShown = true;
} else {
pickerArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
setMenuItemsVisible(true);
citiesListView.setVisibility(View.INVISIBLE);
isPickerShown = false;
}
}
private void setMenuItemsVisible(boolean b) {
Menu menu = navigationView.getMenu();
for (int i = 0; i < menu.size(); ++i) {
menu.getItem(i).setVisible(b);
}
}
@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_main, menu);
navigationView.inflateMenu(R.menu.activity_main_drawer);
return true;
}
// Rest of the code
我想制作一个功能与 Gmail 应用程序相同的 Spinner。
具体而言,微调器应在单击时将 NavigationDrawer
的菜单项替换为项目列表。我想我应该使用 ListView
但不知道将它放在哪里以及如何用它动态替换菜单项。
我怎样才能实现这个功能?提前致谢!
可能您正在寻找这样的东西 在你里面activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Spinner element
Spinner spinner = (Spinner) findViewById(R.id.spinner);
// Spinner click listener
spinner.setOnItemSelectedListener(this);
// Spinner Drop down elements
List<String> categories = new ArrayList<String>();
categories.add("Automobile");
categories.add("Business Services");
categories.add("Computers");
categories.add("Education");
categories.add("Personal");
categories.add("Travel");
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, categories);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// On selecting a spinner item
String item = parent.getItemAtPosition(position).toString();
// Showing selected spinner item
Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
在activity.xml
<Spinner
android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/spinner_title"/>
有关完整教程,请参阅此站点 android Spinners
您不应该使用 Spinner。只需使用其他元素即可实现相同的行为。您只需更改其适配器即可更改列表内容。
你可以在官方文档中看到很好的例子:https://developer.android.com/training/implementing-navigation/nav-drawer.html
您可以使用这个不错的库,它可以为您完成所有这些事情。
首先感谢大家的回答!感谢您的帮助!
事实证明,使用 ImageView
和 TextView
并在最后设置 onClickListener
而不是 Spinner
是实现所需功能的更简单方法。在单击事件中,我只是隐藏菜单项并使嵌套在 NavigationView
内的 ListView
可见。生成的代码如下所示:
activity_main.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/header"
layout="@layout/nav_header_main" />
<ListView
android:id="@+id/citiesListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@null"
android:dividerHeight="0dp"
android:listSelector="@android:color/transparent"
android:paddingTop="8dp" />
</LinearLayout>
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
结果:
nav_header_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:paddingBottom="8dp"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/app_name"
android:textColor="@android:color/white"
android:textSize="25sp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:paddingBottom="10dp"
android:paddingTop="10dp">
<TextView
android:id="@+id/cityPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Astana"
android:textSize="15sp" />
<ImageView
android:id="@+id/pickerArrow"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginEnd="30dp"
android:layout_marginRight="30dp" />
</RelativeLayout>
</RelativeLayout>
结果:
主要活动:
// ................
private NavigationView navigationView;
private TextView cityPickerTextView;
private ListView citiesListView;
private ImageView pickerArrow;
private boolean isPickerShown = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ................
findViewById(R.id.header).setVisibility(View.INVISIBLE);
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.inflateHeaderView(R.layout.nav_header_main);
cityPickerTextView = (TextView) headerView.findViewById(R.id.cityPicker);
cityPickerTextView.setText(cities[0]);
cityPickerTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleMenu();
}
});
cityPickerTextView.bringToFront();
pickerArrow = (ImageView) headerView.findViewById(R.id.pickerArrow);
pickerArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
citiesListView = (ListView) findViewById(R.id.citiesListView);
citiesListView.setVisibility(View.INVISIBLE);
final CityPickerAdapter adapter = new CityPickerAdapter(this, cities, userCity);
citiesListView.setAdapter(adapter);
citiesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
userCity = cities[i];
cityPickerTextView.setText(userCity);
adapter.updateCurrentCity(userCity);
}
});
}
private void toggleMenu() {
if (!isPickerShown) {
pickerArrow.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
setMenuItemsVisible(false);
citiesListView.setVisibility(View.VISIBLE);
isPickerShown = true;
} else {
pickerArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
setMenuItemsVisible(true);
citiesListView.setVisibility(View.INVISIBLE);
isPickerShown = false;
}
}
private void setMenuItemsVisible(boolean b) {
Menu menu = navigationView.getMenu();
for (int i = 0; i < menu.size(); ++i) {
menu.getItem(i).setVisible(b);
}
}
@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_main, menu);
navigationView.inflateMenu(R.menu.activity_main_drawer);
return true;
}
// Rest of the code