上篇博文中点击打开链接我们实现了向ActionBar中添加tab导航栏,那么这次呢我们实现的是向ActionBar中添加下拉列表。
具体的实现步骤:
1、activity_main.xml文件中只需要给线性或相对布局一个资源id就可以了
2、在values文件夹下的strings.xml文件中定义一个数组资源
3、定义一个MyFragment和自定义一个布局用来显示我们点击不同条目时的值的变化并填充到Activity中
4、在MainActivity中的具体实现。
接下来就是具体是实现代码了:
一、activity_main.xml文件:同样,给个id就可以了
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
</RelativeLayout>
二、在values文件夹下的strings.xml文件中定义一个数组资源
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">_10ActionBar添加Dropdown</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string-array name="names">
<item >唐僧</item>
<item >孙悟空</item>
<item >猪八戒</item>
<item >沙和尚</item>
</string-array>
</resources>
三、MyFragment和自定义一个布局:
自定义的布局:只有一个TextView用来显示我们选中条目时传来的值
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MyFragment:
package com.example.dropdown;
import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@SuppressLint("NewApi")
public class MyFragment extends Fragment {
private TextView tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, null);
tv = (TextView) view.findViewById(R.id.tv);
//使用getTag方法获得列表内容切换时传来的值,是MainActivity中replace的第三个参数
String name = getTag();
tv.setText(name);
return view;
}
}
四、MainActivity中的具体实现:
package com.example.dropdown;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.view.Menu;
import android.widget.ArrayAdapter;
public class MainActivity extends Activity {
private ActionBar bar;
private MyFragment fragment;
private String[] names;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bar = getActionBar();
// 设置为下拉导航模式
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// 创建适配器
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.names,
android.R.layout.simple_dropdown_item_1line);
// 设置适配器以及监听器
bar.setListNavigationCallbacks(adapter, new MyListener());
// 获得自定义的资源文件
names = getResources().getStringArray(R.array.names);
}
// 设置选中条目时的点击事件
@SuppressLint("NewApi")
class MyListener implements OnNavigationListener {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
// 实例化我们自定义的Fragment对象
fragment = new MyFragment();
// 获取事务
FragmentTransaction transaction = getFragmentManager()
.beginTransaction();
// 替换Activity中的布局并用第三个参数把选中的条目所对应的值传递给Fragment
transaction.replace(R.id.container, fragment, names[itemPosition]);
// 提交事务
transaction.commit();
// 把返回值改为true
return true;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
运行结果: