我有一个使用SupportActionBar的应用。我是一个行动的自定义视图。
问题是,当我长按时,默认操作会显示工具提示,但我的自定义操作不会。
所以这是默认操作(如您所见,有一个工具提示):
这是我的自定义操作(此工具没有工具提示:/):
这些2的xml:
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto">
<item
android:visible="false"
android:title="Clear history"
android:id="@+id/action_clear_history"
custom:showAsAction="always"
android:icon="@drawable/ic_action_trash" />
<item
android:title="Open chat"
android:id="@+id/action_chat"
custom:showAsAction="always"
custom:actionLayout="@layout/ab_chat" />
</menu>
有人可以帮忙吗?
答案 0 :(得分:9)
我认为没有任何“官方”API调用。我相信在您的自定义视图中添加View.OnClickListener
,正如其他答案所示,尽可能好。
但是,您可以做得更好一点,就是正确计算刀尖吐司的位置。我建议只需复制并粘贴ActionMenuItemView
类(来自支持库源代码)中的相关代码段,因为它处理了一些特殊情况:
@Override
public boolean onLongClick(View v) {
if (hasText()) {
// Don't show the cheat sheet for items that already show text.
return false;
}
final int[] screenPos = new int[2];
final Rect displayFrame = new Rect();
getLocationOnScreen(screenPos);
getWindowVisibleDisplayFrame(displayFrame);
final Context context = getContext();
final int width = getWidth();
final int height = getHeight();
final int midy = screenPos[1] + height / 2;
int referenceX = screenPos[0] + width / 2;
if (ViewCompat.getLayoutDirection(v) == ViewCompat.LAYOUT_DIRECTION_LTR) {
final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
referenceX = screenWidth - referenceX; // mirror
}
Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT);
if (midy < displayFrame.height()) {
// Show along the top; follow action buttons
cheatSheet.setGravity(Gravity.TOP | GravityCompat.END, referenceX, height);
} else {
// Show along the bottom center
cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height);
}
cheatSheet.show();
return true;
}
您可以在<android-sdk>\sources\android-21\android\support\v7\internal\view\menu
找到它。
答案 1 :(得分:2)
简单而完美的方式,只需使用android.support.v7.widget.TooltipCompat
:
TooltipCompat.setTooltipText(view, "...");
答案 2 :(得分:0)
当您使用按钮的自定义布局时,以下代码应该有效:
view.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View view) {
Toast toast = Toast.makeText(v.getContext(), "Open chat", Toast.LENGTH_SHORT);
toast.show();
return true;
}
}
只需将其设置为操作栏中按钮的长按侦听器即可。
答案 3 :(得分:0)
尝试将值withText添加到showAsAction功能。像这样的东西
android:showAsAction="ifRoom|always|withText"
答案 4 :(得分:0)
使用findItem
上的Menu
方法获取您的观看次数,并在您的观看次数上设置OnLongClickListener
。
添加热线xml
的{{1}}菜单文件中的一处更改(您可以更改android:actionViewClass="android.widget.ImageButton"
):
View
你可能会因为获得你的父母而感到错误<item
android:title="Open chat"
android:id="@+id/action_chat"
custom:showAsAction="always"
android:actionViewClass="android.widget.ImageButton"
custom:actionLayout="@layout/ab_chat" />
我认为应该是你自定义布局的主视图。您可以先使用它,然后再使用View
现在进入actionViewClass
长按活动:
onCreateOptionMenu()
在 @Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
getSupportMenuInflater().inflate(R.menu.menu_xml, menu);
/*
As per your defined view in XML of MENU
*/
ImageButton view = (ImageButton) menu.findItem(R.id.action_chat).getActionView();
view.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
// TODO Auto-generated method stub
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
Toast toast = Toast.makeText(context, "Open Chat", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP, width - 200, 50); //your width and height
toast.show();
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
Toast
Gravity
您可以看到:Playing with Toast
答案 5 :(得分:0)
创建自定义布局并在操作栏上设置此布局,我希望它可能适合您
View view = getLayoutInflater().inflate(R.layout.actionbar_demo,null);
btn = (ImageView) view.findViewById(R.id.btn_action);
btn.setOnLongClickListener(new OnLongClickListener()
{
@Override
public boolean onLongClick(View v) {
return true;
}
});
getActionBar() . setCustomView(view);
你也可以这样实现
ActionBar actionBar = getSupportActionBar();
actionBar.setCustomView(R.layoutcustom_action_bar);
actionBar.setDisplayShowCustomEnabled(true);
mLogo = (ImageView) actionBar.getCustomView().findViewById(
R.id.logo);
mLogo.setOnLongClickListener(new OnLongClickListener()
{
@Override
public boolean onLongClick(View v) {
return true;
}
});