GVKun编程网logo

android – ShareAAction = ifRoom时,ShareActionProvider不起作用(android share library)

13

对于android–ShareAAction=ifRoom时,ShareActionProvider不起作用感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解androidsharelibra

对于android – ShareAAction = ifRoom时,ShareActionProvider不起作用感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解android share library,并且为您提供关于action="#{languageFrom.showChoice}": Target Unreachable, identifier 'languageFrom' resolved to null、ActionBar 中 ShareActionProvider 简单使用、Android ActionBar ActionProvider子菜单、Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu的宝贵知识。

本文目录一览:

android – ShareAAction = ifRoom时,ShareActionProvider不起作用(android share library)

android – ShareAAction = ifRoom时,ShareActionProvider不起作用(android share library)

我正在创建一个小应用程序,并试图在ActionBar上提供一个Share按钮.相关代码如下:

表现

<uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="18" />

菜单项

<item android:id="@+id/shareMenuItem" android:showAsAction="never" android:title="@string/shareAction" android:orderInCategory="100" android:actionProvider></item>

活动

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        MenuItem shareItem = menu.findItem(R.id.shareMenuItem);
        mShareActionProvider = (ShareActionProvider) shareItem.getActionProvider();
        return super.onCreateOptionsMenu(menu);
    }

在这种情况下一切正常.我想在ActionBar上显示Share按钮并更改showAsAction =“ifRoom”. “共享”按钮现在显示在ActionBar中,但不可点击.

我试图将其他菜单项更改为ifRoom,它们工作正常.不太明白为什么单独的Share按钮无法正常工作.任何帮助/建议表示赞赏!

解决方法

“不可点击”的shareAction按钮的原因是缺少actionProvider的意图(这是Android可以找到匹配的意图).
尝试通过设置
mShareActionProvider.setShareIntent(youIntentWithAction);

从onCreateOptionsMenu返回之前

更新
我认为它只适用于showAsAction =“never”的情况,因为打开溢出选项(标记为“never”)时正确设置了intent并点击了shareItem,当你在动作中使用它时就不会发生这种情况酒吧.
一个猜测是你在onPrepareOptionsMenu的实现中设置了你的动作意图(如果你有的话),只有当你打开溢出项目(在启动期间一次)而不是actionBar项目时才会调用它.

一件重要的事情是:
对于带有actionProvider的menuItem,不会触发onoptionsItemSelected,如果它显示在操作栏中(例如,如果此actionProvider在溢出菜单中,则actionProvider仍会触发onoptionsItemSelected用户操作).

这可能解释了为什么当showAsAction =“ifRoom”时你没有机会为actionProvider动态设置ShareIntent.

如果仍然需要onoptionsItemSelected中的setShareIntent,则在处理另一个(非actionProvier)项的选择时可能需要执行此操作.

如果有帮助,请告诉我.

action=

action="#{languageFrom.showChoice}": Target Unreachable, identifier 'languageFrom' resolved to null

package yingServlet; 


import javax.faces.bean.ManagedBean;  //记得不是import javax.annotation.ManagedBean;    @ManagedBean  public class LanguageForm { private String language ; public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language.trim() ;    }   public String showChoice() {  if (isMissing(language)) {  return "missing-language" ;  }  else if (language.equalsIgnoreCase("Java") || language.equalsIgnoreCase("Groovy")) {  return "good-language" ;  }  else {  return "bad-language" ;  } }  private boolean isMissing(String value) {  return (value == null) || value.trim().isEmpty() ;  } }

ActionBar 中 ShareActionProvider 简单使用

ActionBar 中 ShareActionProvider 简单使用

// 功能:点击中间机器人图标打开图库 然后选中要分享的图片

// 在点击选择菜单分享图标 分享到需要分享的地方


效果示例图:







1、选择菜单  share_menu.xml 布局

代码


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

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


    <item

        android:id="@+id/actionprovider"

        android:actionProvider

        android:showAsAction="always"

        android:title=""/>


</menu>




===================


2、主布局 activity_main.xml


代码


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

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="${relativePackage}.${activityClass}" >


    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="@string/hello_world" />

    

    

    <ImageView

        android:id="@+id/imageview"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/ic_launcher" 

        android:layout_centerInParent="true"

        android:onClick="onclickImage"/>


</RelativeLayout>



==============


3、MainActivity 类


代码

public class MainActivity extends Activity {


private ShareActionProvider provider;

private ImageView imageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

this.imageView = (ImageView) this.findViewById(R.id.imageview);

}

// 图片点击事件监听

public void onclickImage(View view){

Intent intent = new Intent();

intent.setAction (Intent.ACTION_GET_CONTENT);// 打开图库的动作设置

intent.setType("image/*");

int requestCode = 1;

startActivityForResult(intent, requestCode );

}

// 打开图库后选择图片后的回调方法

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if(requestCode == 1 && resultCode == Activity.RESULT_OK){

Uri uri = data.getData();

try {

ContentResolver resolver = getContentResolver();

InputStream is = resolver.openInputStream(uri);

Bitmap bitmap = BitmapFactory.decodeStream(is);

imageView.setImageBitmap(bitmap);

} catch (Exception e) {

e.printStackTrace();

}

// 设置分享的数据和类型

Intent intent = new Intent();

intent.setAction(Intent.ACTION_SEND);

intent.setType("image/*");

intent.putExtra(Intent.EXTRA_STREAM, uri);

// 通过 setShareIntent 方法设置要分享的数据

provider.setShareIntent(intent);

}

}

// 创建一个选择菜单

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.share_menu, menu);

/*// 文本分享

shareTxt(menu);*/

// 分享图片

shareImg(menu);

return super.onCreateOptionsMenu(menu);

}

private void shareImg(Menu menu) {

MenuItem item_provider = menu.findItem(R.id.actionprovider);

   provider = (ShareActionProvider) item_provider.getActionProvider();

}

/*// 分享文本的方法

public void shareTxt(Menu menu) {

MenuItem item_provider = menu.findItem(R.id.actionprovider);

   provider = (ShareActionProvider) item_provider.getActionProvider();

   

   Intent intent = new Intent();

   intent.setAction(Intent.ACTION_SEND);

   intent.setType("text/plain");

   intent.putExtra (Intent.EXTRA_TEXT, "这是文本信息");

  // 用 ShareActionProvider 发送意图

   provider.setShareIntent(intent);

}*/

}


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 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 – ShareAAction = ifRoom时,ShareActionProvider不起作用android share library的介绍到此结束,谢谢您的阅读,有关action="#{languageFrom.showChoice}": Target Unreachable, identifier 'languageFrom' resolved to null、ActionBar 中 ShareActionProvider 简单使用、Android ActionBar ActionProvider子菜单、Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu等更多相关知识的信息可以在本站进行查询。

本文标签: