【问题标题】:Is it possible to use sliding tabs and a spinner in the action bar in Android是否可以在 Android 的操作栏中使用滑动选项卡和微调器
【发布时间】:2013-11-20 11:42:09
【问题描述】:

我目前有一个带有滑动选项卡的 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

【问题讨论】:

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


    【解决方案1】:

    所以,首先创建一个标记文件来放置您的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 创建此菜单,请不要忘记在Fragment.onCreate() 的某个位置调用setHasOptionMenu(true)

    用这个代替... // 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);  
    

    我希望我没有错过什么。祝你好运!

    【讨论】:

    • 感谢您的建议。我试过这个,但没有用。它仍然不显示 Spinner 中的项目列表,而且它现在与溢出菜单重叠,因此菜单不显示。是否可以在操作栏中设置微调器并在下方设置选项卡并始终保持这种状态,即使手机已旋转?
    • 让我澄清一些方面 - 微调器是空的还是没有显示?为避免菜单重叠,请尝试使用微调器大小 - 就我而言,它非常小(只有一个文字),我没有遇到这样的问题。此外,如果您发布代码,则更容易理解到底发生了什么。
    • 我刚刚添加了到目前为止的代码。请编码你帮助我,并问我你需要澄清的任何其他问题。微调器显示,但它是空的,并且之前使用此代码工作过,但由于某种原因它与溢出菜单重叠。
    • 我刚刚弄清楚它为什么会重叠。我的选项卡菜单文件中有那个微调器和一个额外的微调器。我现在已经解决了这个问题。虽然我的空的问题仍然很明显。如果您知道如何解决此问题,请告诉我。
    • 嗯...我在您的代码中没有发现明显的错误。 LogCat 输出对我来说没有信息。尝试用硬编码的字符串数组填充适配器,而不是仅仅为了测试的资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多