是否可以在Android的操作栏中使用滑动标签和微调器

时间:2013-11-20 11:42:09

标签: android android-actionbar actionbarsherlock spinner android-tabs

我目前有一个带有滑动标签的Activity,我一直在使用ActionBarSherlock,但我想在操作栏中设置一个微调器,以便用户可以从微调器中选择项目,每个项目都是一个特定的文件打开值以重新填充每个选项卡上的视图。我已经看过如何做到这一点,到目前为止还没有任何运气。我不希望它们同时浏览片段,而是让微调器重新填充选项卡上的视图。我看了一个类似的问题Is it possible to use dropdown AND tabs as navigation in the action bar?,这是我想要的样子,但他的问题是使用两种不同类型的导航。请任何人帮助我,如果可能,请告诉我。先感谢您。我刚刚看了一个我有的Android应用程序,它是Eurosport应用程序,如果有人有这个应用程序看我的意思,它有我正在寻找的布局类型。

这是我的代码:

public class SlidingTabsActivity extends SherlockFragmentActivity
{

ViewPager viewPager;
TabsAdapter tabsAdapter;
ActionBar actionBarTabs;
Spinner spinner;
ArrayAdapter<String> arrayAdapter;
LayoutInflater spinnerLayoutInflater;
View spinnerView;

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

    viewPager = new ViewPager(this);
    viewPager.setId(R.id.pager);
    setContentView(viewPager);

    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, R.array.device_description);
    arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerLayoutInflater = (LayoutInflater) this.getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    spinnerView = spinnerLayoutInflater.inflate(R.layout.spinner, null);
    spinner = (Spinner) spinnerView.findViewById(R.id.tabsSpinner);
    spinner.setAdapter(arrayAdapter);
    spinner.setOnItemSelectedListener(new OnItemSelectedListener()
    {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) 
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) 
        {
            // TODO Auto-generated method stub

        }

    });

    actionBarTabs = getSupportActionBar();
    actionBarTabs.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBarTabs.setCustomView(spinnerView);
    actionBarTabs.setDisplayShowCustomEnabled(true);
    actionBarTabs.setDisplayHomeAsUpEnabled(true);

    tabsAdapter = new TabsAdapter(this, viewPager); // Declares the tabs adapter class with the view pager view

    /* Adds fragments to the tabs adapter */
    tabsAdapter.addTab(actionBarTabs.newTab().setText("PV"), Fragment_1.class, null);
    tabsAdapter.addTab(actionBarTabs.newTab().setText("CONFIG"), Fragment_2.class, null);
    tabsAdapter.addTab(actionBarTabs.newTab().setText("DIAG"), Fragment_3.class, null);

}

这是我的Spinner代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<Spinner
    android:id="@+id/tabsSpinner"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" />

</RelativeLayout>

按下Spinner时,我在logcat中收到此消息:

11-26 12:22:44.282: W/InputEventReceiver(7217): Attempted to finish an input event but the input event receiver has already been disposed.
11-26 12:22:44.282: W/InputMethodManagerService(525): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4216a290 attribute=null, token = android.os.BinderProxy@42618330

1 个答案:

答案 0 :(得分:0)

因此,首先创建一个标记文件来放置Spinner,例如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent" >

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:spinnerMode="dropdown" >
    </Spinner>

</RelativeLayout>  

接下来创建菜单资源,例如main_menu.xml并将其放入res/menu文件夹:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_change_content"
        android:actionLayout="@layout/spinner_layout"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:title="@string/empty">
    </item>

</menu>  

请注意我们为此菜单项指定了自定义操作布局 - 这是我们之前创建的布局,它包含我们的Spinner。在Activity(或Fragment)旁边,您必须为此菜单充气:
如果您在Activity

中创建此菜单,请使用此选项
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    ...// init spinner, will be explained below
    return true;
}

或者如果您在Fragment中创建菜单:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.card_storage, menu);
    ...// init spinner
}  

如果您为Fragment创建此菜单,请不要忘记在setHasOptionMenu(true)中的某个地方拨打Fragment.onCreate()

将其替换为... // init spinner

MenuItem item = menu.findItem(R.id.action_change_content); // id of our custom menu item
CustomSpinnerAdapter adapter = new CustomSpinnerAdapter(); // your adapter
Spinner spinner = (Spinner) item.getActionView().findViewById(R.id.spinner); 
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);  

我希望我没有错过任何东西。祝你好运!