GVKun编程网logo

android – onPrepareOptionsMenu在ActionBar中复制项目(android 复制粘贴)

10

对于android–onPrepareOptionsMenu在ActionBar中复制项目感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍android复制粘贴,并为您提供关于AndroidAc

对于android – onPrepareOptionsMenu在ActionBar中复制项目感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍android 复制粘贴,并为您提供关于Android ActionBar ActionProvider子菜单、Android ActionBar NullPointerException、Android ActionBar(ActionBarCompat)Spinner下拉列表?、Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu的有用信息。

本文目录一览:

android – onPrepareOptionsMenu在ActionBar中复制项目(android 复制粘贴)

android – onPrepareOptionsMenu在ActionBar中复制项目(android 复制粘贴)

当我使用onPrepareOptionsMenu添加菜单项时,菜单项会在操作栏中复制其自身.我正在使用片段并在主要活动的ActionBar中创建初始菜单,如下所示:

...
 @Override
    public boolean onCreateOptionsMenu(Menu paramMenu) {
    super.onCreateOptionsMenu(paramMenu);
    paramMenu.add(0, 1, 0, "DashBoard").setIcon(R.drawable.ic_dashboard)
        .setShowAsAction(1);
    return true;
    }

然后我在其中一个片段中添加另一个项目如下:

...
@Override
    public void onPrepareOptionsMenu(Menu paramMenu) {
    paramMenu.add(0, 2, 1, "FullScreen").setIcon(R.drawable.ic_fullscreen)
        .setShowAsAction(1);
    }

由于某种原因,通过片段类添加的项目显示两次….我有什么不对吗?

对我的错误的任何帮助将不胜感激

解决方法:

该项目可能会显示两次,因为您要添加两次.见docs for onPrepareOptionsMenu

This is called right before the menu is shown, every time it is shown.

我真的不会盲目地在onPrepareOptionsMenu中添加一个项目.您应该检查它是否已经先添加.

Android ActionBar ActionProvider子菜单

Android ActionBar ActionProvider子菜单

我只是不能让ActionProvider显示一个子菜单,我不明白为什么.我的菜单在xml中定义:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
        android:id="@+id/dossier_menu"
        android:showAsAction="always"
        android:actionProviderhttps://www.jb51.cc/tag/so/" target="_blank">.some.other.mockup.MActionProvider">
</item>
</menu>

动作提供者类:

public class MActionProvider extends ActionProvider  {

private static final String TAG = "MActionProvider";
private static final int LIST_LENGTH = 3;
private Context context;

/**
 * Creates a new instance.
 *
 * @param context Context for accessing resources.
 */
public MezzActionProvider(Context context) {
    super(context);
    this.context = context;
}

@Override
public View onCreateActionView() {
    View view = View.inflate(context, R.layout.action_layout, null);
    //view must be returned not tetxView or just buttonView
    return view;
}

@Override
public boolean hasSubMenu() {
    Log.d(TAG, "hasSubMenu");
    return true;
}


@Override
public boolean onPerformDefaultAction() {
    Log.d(TAG, "onPerformDefaultAction");
    return super.onPerformDefaultAction();
}

/**add submenu in code**/
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
    Log.d(TAG, "onPrepareSubMenu");

    subMenu.clear();
    subMenu.add(Menu.NONE, Menu.NONE, 1,"Mezz 1");
    subMenu.add(Menu.NONE, Menu.NONE, 2, "Mezz 2");

}

}

和行动布局是:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mezz State ++"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_margin="4dp"/>
<ImageView
        android:layout_width="wrap_content"
        android:layout_height="@dimen/buttonHeight"
        android:src="@android:drawable/ic_menu_add"
        android:layout_alignParentLeft="true"
        android:id="@+id/img1"
        android:layout_below="@id/textView"/>

我尝试使用按钮而不是图像视图,甚至尝试将子菜单添加到xml中的菜单项,当我点击动作提供程序时它只是没有显示任何子菜单我无法弄清楚为什么.

谢谢

解决方法:

我在这里找到了答案:

Can’t display sub-menu for custom ActionProvider

问题是我的onCreateActionView()方法不返回null.

所以感谢Jason Robinson的回答是:

@Override
public View onCreateActionView() {
  View view = View.inflate(context, R.layout.action_layout, null);

  final PopupMenu menu = new PopupMenu(mContext, view);
  menu.inflate(R.menu.submenu);
  menu.setonMenuItemClickListener(this);

  view.setonClickListener(new OnClickListener() {

    @Override
    public void onClick(View v){
        menu.show();
    }
  });

return view;
}

和submenu.xml包含:

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

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

    <item
            android:id="@+id/mezzSub1"
            android:title="Mezz 1"
            android:showAsAction="always"></item>
    <item
            android:id="@+id/mezzSub2"
            android:title="Mezz 2"
            android:showAsAction="always"></item>

</menu>

Android ActionBar NullPointerException

Android ActionBar NullPointerException

我想启用 Android ActionBar,但它对我不起作用.

这是我的MainActivity:

public void onCreate(Bundle savedInstanceState) {

        this.requestwindowFeature(Window.FEATURE_NO_TITLE);


        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        ActionBar actionBar = getActionBar();
        actionBar.show();
        //more code............

这是logcat:

03-04 16:31:09.423: E/AndroidRuntime(1441): FATAL EXCEPTION: main
03-04 16:31:09.423: E/AndroidRuntime(1441): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.salebook/com.example.salebook.MainActivity}: java.lang.NullPointerException
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2180)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.os.Looper.loop(Looper.java:137)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.ActivityThread.main(ActivityThread.java:5041)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at java.lang.reflect.Method.invokeNative(Native Method)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at java.lang.reflect.Method.invoke(Method.java:511)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at dalvik.system.NativeStart.main(Native Method)
03-04 16:31:09.423: E/AndroidRuntime(1441): Caused by: java.lang.NullPointerException
03-04 16:31:09.423: E/AndroidRuntime(1441):     at com.example.salebook.MainActivity.onCreate(MainActivity.java:130)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.Activity.performCreate(Activity.java:5104)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-04 16:31:09.423: E/AndroidRuntime(1441):     at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2144)
03-04 16:31:09.423: E/AndroidRuntime(1441):     ... 11 more

第130行是anctionBar.show(),我在res / menu / menu.xml中:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/itemid_0"
        android:title="Action Item 0"
        android:icon="@drawable/ic_launcher"
        android:orderInCategory="0"
        android:showAsAction="ifRoom|withText" />
    <item android:id="@+id/itemid_1"
        android:title="Action Item 1"
        android:orderInCategory="0" />
    <item android:id="@+id/itemid_2"
        android:title="Action Item 2"
        android:orderInCategory="0" />
    <item android:id="@+id/itemid_3"
        android:title="Action Item 3"
        android:orderInCategory="0" />
</menu>

我没有发现问题.希望有人帮助我.

谢谢.

另外,在appThem风格:

<style name="AppTheme" parent="AppBaseTheme">
        <item name="android:windowActionBar">true</item>
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

解决方法

您的Actionbar返回null,因为您没有操作栏但是您正在请求使用getActionbar()

确保您具有显示操作栏的窗口功能,这是操作栏显示所必需的.有关详细信息,请查看以下链接.
…检查此问题getActionBar returns null并查看此链接以获取有关您的问题http://blog.perpetumdesign.com/2011/08/strange-case-of-dr-action-and-mr-bar.html的更多信息

Android ActionBar(ActionBarCompat)Spinner下拉列表?

Android ActionBar(ActionBarCompat)Spinner下拉列表?

我目前正在为ActionBar(ActionBarCompat)工作,我需要一些关于actionbar的澄清.

我正在使用像这样的微调器布局,

<Spinner 
        android:id="@+id/SpinnerList"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

我的代码,

public class MainActivity extends ActionBaractivity implements  OnItemSelectedListener{
    private boolean mAlternateTitle = false;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ActionBar bar = getActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

        Spinner spinner = (Spinner) findViewById(R.id.SpinnerList);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromresource(this,R.array.locations,android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setonItemSelectedListener(this);
}
}

它在我的android galaxy ace中显示正常的微调器.我需要输出如下所示,
是那个位置android 2.3.请给出建议.

谢谢.

解决方法

试试这个代码.
在menu / main.xml中:
<item
    android:id="@+id/menu_spinner1"
    android:showAsAction="always"
    android:orderInCategory="1"
    android:actionView>

在活动中:

private MenuItem mSpinnerItem1 = null;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.


    MenuInflater mi=getMenuInflater();
    mi.inflate(R.menu.main,menu);
    mSpinnerItem1 = menu.findItem( R.id.menu_spinner1);
    View view1 = mSpinnerItem1.getActionView();
    if (view1 instanceof Spinner)
    {
        final Spinner spinner = (Spinner) view1;
        spinner.setAdapter(ad1);


        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

            }
        });

    }

    return true;
}

Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu

Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu



Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu

Android早期推出的ActionBarActivity被Android谷歌官方废弃,推荐使用AppCompatActivity替代ActionBarActivity。在实际的开发中现在也基本上不再怎么使用ActionBar,而是使用最新的Toolbar替代ActionBar了,但是ActionBar也有其自身比较有特点的地方,比如ActionBar自身对SearchView,ShareActionProvider的良好支持,使得ActionBar在某些应用开发场景中依然有其用武之地。
现在给出一个例子说明如何在一个ActionBar中实现SearchView和ShareActionProvider。
先把完整的代码实现给出,然后结合代码加以说明。
测试用的主Activity,MainActivity.java:

package zhangphil.toolbar;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.MenuItemCompat.OnActionExpandListener;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ActionBar ab = this.getSupportActionBar();
		ab.setDisplayHomeAsUpEnabled(true);
	}

	private Intent getMyIntent() {
		Intent intent = new Intent(Intent.ACTION_SEND);
		intent.setType("text/plain");
		intent.putExtra(Intent.EXTRA_SUBJECT, "主题");
		intent.putExtra(Intent.EXTRA_TEXT, "我的文字内容,zhangphil text");
		return intent;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);

		MenuItem searchItem = menu.findItem(R.id.search);
		SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
		searchView.setOnQueryTextListener(new OnQueryTextListener() {
			@Override
			public boolean onQueryTextChange(String queryText) {
				Toast.makeText(getApplicationContext(), "onQueryTextChange:" + queryText, Toast.LENGTH_SHORT).show();
				return true;
			}

			@Override
			public boolean onQueryTextSubmit(String queryText) {
				Toast.makeText(getApplicationContext(), "onQueryTextSubmit:" + queryText, Toast.LENGTH_SHORT).show();
				return true;
			}
		});

		OnActionExpandListener expandListener = new OnActionExpandListener() {
			@Override
			public boolean onMenuItemActionCollapse(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionCollapse", Toast.LENGTH_SHORT).show();
				return true;
			}

			@Override
			public boolean onMenuItemActionExpand(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
				return true;
			}
		};

		MenuItemCompat.setOnActionExpandListener(searchItem, expandListener);

		MenuItem shareItem = menu.findItem(R.id.share);
		ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
		shareActionProvider.setShareIntent(getMyIntent());

		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {

		case R.id.share:
			Toast.makeText(getApplicationContext(), "分享", Toast.LENGTH_SHORT).show();
			return true;

		case R.id.setting:
			Toast.makeText(getApplicationContext(), "设置", Toast.LENGTH_SHORT).show();
			return true;

		case R.id.about:
			Toast.makeText(getApplicationContext(), "关于", Toast.LENGTH_SHORT).show();
			return true;

		default:
			return super.onOptionsItemSelected(item);
		}
	}
}


在本例中,MainActivity.java不依赖任何布局文件,只是需要加载menu菜单,所以需要在res/menu/目录下写一个menu菜单的XML文件,定义menu的item,此代码文件在本例中称之为main.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" >

    <item
        android:id="@+id/search"
        android:title="搜索"
        app:actionViewapp:showAsAction="ifRoom|collapseActionView"/>
    <item
        android:id="@+id/share"
        android:title="分享"
        app:actionProviderapp:showAsAction="ifRoom|withText"/>
    <item
        android:id="@+id/setting"
        android:title="设置"
        app:showAsAction="never"/>
    <item
        android:id="@+id/about"
        android:title="关于"
        app:showAsAction="ifRoom"/>

</menu>

在MainActivity.java中的一个方法体中,重写:
public boolean onCreateOptionsMenu(Menu menu);
方法将依据res/menu/main.xml文件创建菜单。在这个方法中,为id为search的menu item创建响应搜索事件。同时,附带的为搜索item绑定了展开和收缩事件:

OnActionExpandListener expandListener = new OnActionExpandListener() {
			@Override
			public boolean onMenuItemActionCollapse(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionCollapse", Toast.LENGTH_SHORT).show();
				return true;
			}

			@Override
			public boolean onMenuItemActionExpand(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
				return true;
			}
		};

		MenuItemCompat.setOnActionExpandListener(searchItem, expandListener);


对于菜单中分享菜单share item,则为其设置了ShareActionProvider,提供分享事件的数据和动作支持:

MenuItem shareItem = menu.findItem(R.id.share);
		ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
		shareActionProvider.setShareIntent(getMyIntent());


其他次要普通的菜单选择事件则放在
public boolean onOptionsItemSelected(MenuItem item);
中完成。


图1是代码运行后,点击分享icon切换到微信的ActionBar状态:




图2则是点击了搜索item时候的ActionBar状态:


今天关于android – onPrepareOptionsMenu在ActionBar中复制项目android 复制粘贴的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android ActionBar ActionProvider子菜单、Android ActionBar NullPointerException、Android ActionBar(ActionBarCompat)Spinner下拉列表?、Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu的相关知识,请在本站搜索。

本文标签: