gpt4 book ai didi

Android 菜单到选项卡式操作栏

转载 作者:行者123 更新时间:2023-11-29 16:13:34 24 4
gpt4 key购买 nike

我正在创建一个包含 4 个主要部分的应用程序。我想要一种非常简单的导航方式,这意味着如果手机支持操作栏,那么我希望它显示一个选项卡式操作栏。否则显示菜单的常规菜单按钮就可以了。

问题在于,当在具有实际支持操作栏的 SDK 版本的手机上试用操作栏时,操作栏接缝无法管理或无法创建。

我正在使用 menu/menu.xml 文件来创建我想要显示的菜单和项目。然后我将 onCreateOptionsMenu() 与 MenuInflater 一起使用来填充每个 Activity 的菜单。这在所有手机上都可以正常工作,但在使用操作栏的手机上,我得到一个标题类型栏,最左边是应用程序图标,旁边是当前 Activity 标题,然后最右边是 第一个菜单项的图标,后面是 3 个方 block (当您单击它们时,将显示其余的菜单项)。无论我在哪个 Activity 中,这种情况都会保持不变。

我想要的是一个选项卡式操作栏,而不是显示图标和文本(如果文本有空间),并让用户正在查看的任何当前 Activity 在选项卡式操作栏中被“选中”。此处显示的方式相同:

http://developer.android.com/images/ui/actionbar.png (由于是新用户,我无法将其制作为图像)

这是我使用的代码:

list .xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mypackage"
android:versionCode="1"
android:versionName="1.0" >

<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE" />

<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="15" />

<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo">

<uses-library android:name="com.google.android.maps" />

<activity
android:name=".ActivityLoad"
android:label="label">

<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

....more activities....

</application>

</manifest>

菜单.xml

<?xml version="1.0" encoding="utf-8"?>

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

<item
android:id="@+id/menuMap"
android:title="@string/A_MAP_TITLE"
android:icon="@drawable/nav_map"
android:showAsAction="ifRoom|withText">
</item>

<item
android:id="@+id/menuList"
android:title="@string/A_LIST_TITLE"
android:icon="@drawable/nav_list"
android:showAsAction="ifRoom|withText">
</item>

<item
android:id="@+id/menuMore"
android:title="@string/A_MORE_TITLE"
android:icon="@drawable/nav_more"
android:showAsAction="ifRoom|withText">
</item>

<item
android:id="@+id/menuReport"
android:title="@string/A_REPORT_TITLE"
android:icon="@drawable/nav_report"
android:showAsAction="ifRoom|withText">
</item>

</menu>

MyActivity.java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options, menu);
return super.onCreateOptionsMenu(menu);
}

我已经尝试在我的 Activity onCreate() 方法中使用此代码设置操作栏导航模式,但所有发生的是一个空白操作栏显示在我默认获得的“坏”操作栏下方:

ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

所有教程都只是说“使用样式”或其他内容,但我不知道将样式 xml 文件放在哪里或如何将其设置到我的菜单或我实际上应该在这里做什么。如果有人能提供帮助,我们将不胜感激!

最佳答案

首先确保您的 MyActivity.java 正在实现 ActionBar.TabListener这意味着您将需要重写 3 个函数。我不知道你是如何制作 fragment 的,但我在 MyActivity.java 中是这样做的:

public class MyActivity extends FragmentActivity implements ActionBar.TabListener {

private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

// For each of the section, add a tab to the action bar.
actionBar.addTab(actionBar.newTab().setText(R.string.title_status).setTabListener(this));
actionBar.addTab(actionBar.newTab().setText(R.string.title_configuration).setTabListener(this));
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
getActionBar().setSelectedNavigationItem(
savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
}
}

@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(STATE_SELECTED_NAVIGATION_ITEM,
getActionBar().getSelectedNavigationIndex());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}



@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
// When the given tab is selected, show the tab contents in the container
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, tab.getPosition() + 1);
fragment.setArguments(args);
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, fragment)
.commit();
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

/**
* A dummy fragment representing a section of the app, but that simply displays dummy text.
*/
public static class DummySectionFragment extends Fragment {
public DummySectionFragment() {
}

public static final String ARG_SECTION_NUMBER = "section_number";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setGravity(Gravity.CENTER);
Bundle args = getArguments();
textView.setText(Integer.toString(args.getInt(ARG_SECTION_NUMBER)));
return textView;
}
}
}

为了自定义操作栏,您需要使用以 Theme.Holo 作为父级的自定义样式。这样它就继承了 Holo 主题的所有内容,但您可以覆盖您想要的内容。在 ma​​nifest.xml 中使用:

 <application
android:theme="@style/AppTheme">

代替:

 <application
android:theme="@android:style/Theme.Holo">

然后在 values/styles.xml 中放置您的自定义样式:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="android:Theme.Holo.Light">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="android:actionBarTabStyle">@style/MyActionBarTabStyle</item>
<item name="android:actionBarTabBarStyle">@style/MyActionBarTabBar</item>
</style>

这是有点棘手的地方。在同一文件 (values/styles.xml) 中,您需要定义上面引用的每种样式。

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">@drawable/menu_bar</item> <!-- remove if you don't have custom background for action bar -->
<item name="android:displayOptions"></item> <!-- get rid of logo on left and title, if you want logo on left put useLogo here -->
<item name="android:customNavigationLayout">@layout/custom_action_bar</item> <!-- This is where you define how you want things to layout in your actionbar. I use a relative layout -->
</style>


<!-- Style for tab bar -->
<style name="MyActionBarTabBar" parent="@android:style/Widget.Holo.Light.ActionBar.TabBar">
<item name="android:showDividers">none</item>
<item name="android:paddingLeft">20dp</item>
</style>

<!-- Style for action bar tabs -->
<style name="MyActionBarTabStyle" parent="@android:style/Widget.Holo.Light.ActionBar.TabView">
<item name="android:background">@drawable/menu_tab</item> <!-- I use a background for my tabs also -->
</style>

如果您不关心每个选项卡的自定义背景,请从上面删除最后一个样式。如果您为每个选项卡设置了自定义背景(您需要一张选中状态的 .9.png 图片和一张未选中状态的 .9.png 图片),您将需要 drawable/menu_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="false"
android:dither="true"
android:variablePadding="false" >
<item android:state_selected="true" >
<inset android:insetTop="23dp"
android:insetBottom="26dp" >
<bitmap android:src="@drawable/menu_selected" ></bitmap>
</inset>
</item>
<item android:state_selected="false" >
<inset android:insetTop="20dp"
android:insetBottom="26dp" >
<bitmap android:src="@drawable/menu_not_selected" ></bitmap>
</inset>
</item>
</selector>

现在创建layout/custom_action_bar.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:contentDescription="@string/LogoText"
android:paddingRight="20dp"
android:paddingTop="20dp"
android:src="@drawable/ic_launcher" />

</RelativeLayout>

custom_action_bar 可以是您想要布局其余操作栏元素的任何方式。我只是把标志放在右边,但在你的情况下,你可以使用溢出菜单按钮或任何你想要的。我为操作栏和每个选项卡使用自定义背景。如果这样做,您将需要创建 .9.png 文件以确保它们与不同的屏幕兼容。

最终结果如下: Custom Action Bar

关于Android 菜单到选项卡式操作栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11209688/

24 4 0