如何在自定义操作栏上获取 onClickListener() 事件
Posted
技术标签:
【中文标题】如何在自定义操作栏上获取 onClickListener() 事件【英文标题】:How to get onClickListener() event on custom actionbar 【发布时间】:2013-04-11 08:04:11 【问题描述】:我正在开发一个应用程序,我必须在单击操作栏自定义视图时获得onClick()
事件。到目前为止,我能够实现以下布局。
这是我实现此目的的代码:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
getActionBar().setCustomView(R.layout.custom_image_button);
getActionBar().setDisplayOptions(
ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);
@Override
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case android.R.id.home:
Toast.makeText(getApplicationContext(), "Clicked on ActionBar",
Toast.LENGTH_SHORT).show();
default:
return super.onOptionsItemSelected(item);
这是我的 custom_image_button 布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_layout"
android:layout_
android:layout_
android:orientation="vertical" >
<FrameLayout
android:id="@+id/frame_layout"
android:layout_
android:layout_
android:layout_alignParentRight="true" >
<TextView
android:id="@+id/points"
android:layout_
android:layout_
android:layout_gravity="right"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:background="@drawable/points_yellow"
android:gravity="center"
android:paddingLeft="20dp"
android:textColor="#887141"
android:textIsSelectable="false"
android:textSize="22sp"
android:textStyle="bold" >
</TextView>
<ImageView
android:id="@+id/badge"
android:layout_
android:layout_
android:layout_gravity="top|right"
android:layout_marginRight="5dp"
android:layout_marginTop="0dp"
android:src="@drawable/badge_notification" >
</ImageView>
</FrameLayout>
</RelativeLayout>
我试图在自定义布局上设置一个点击监听器。为此,我尝试了以下代码:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
getActionBar().setCustomView(R.layout.custom_image_button);
getActionBar().setDisplayOptions(
ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);
final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.custom_image_button, null);
frameLayout = (FrameLayout) v.findViewById(R.id.frame_layout);
frameLayout.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
Toast.makeText(getApplicationContext(), "Clicked on 1",
Toast.LENGTH_SHORT).show();
return false;
);
@Override
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case android.R.id.home:
Toast.makeText(getApplicationContext(), "Clicked on ActionBar",
Toast.LENGTH_SHORT).show();
default:
return super.onOptionsItemSelected(item);
但是,我无法在自定义图像上获得 onClick()
事件。我在这里做错了什么,请指导。
我们将不胜感激。
【问题讨论】:
【参考方案1】:在 Inflater 之后它就像布局文件中的视图
所以,你必须在ActionBar
自定义布局文件中添加android:onClick="clickEvent"
这里是演示:
我的主要活动:
package com.example.testdemo;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.Toast;
public class MainActivity extends Activity
private View viewList;
private Dialog dialogMarketList;
String a[] = "a", "aa" ;
private View header;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
View cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
public void clickEvent(View v)
if (v.getId() == R.id.button1)
Toast.makeText(MainActivity.this, "you click on button1",
Toast.LENGTH_SHORT).show();
if (v.getId() == R.id.button2)
Toast.makeText(MainActivity.this, "you click on button2",
Toast.LENGTH_SHORT).show();
if (v.getId() == R.id.textView1)
Toast.makeText(MainActivity.this, "you click on textView1",
Toast.LENGTH_SHORT).show();
我的布局 header.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:gravity="center"
android:orientation="horizontal"
android:weightSum="3" >
<Button
android:id="@+id/button1"
android:layout_
android:layout_
android:layout_weight="1"
android:onClick="clickEvent"
android:text="Button 1" />
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_
android:layout_weight="1"
android:onClick="clickEvent"
android:gravity="center"
android:textColor="#FFFFFF"
android:text="My action bar"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button2"
android:layout_
android:layout_
android:layout_weight="1"
android:onClick="clickEvent"
android:text="Button 2" />
</LinearLayout>
【讨论】:
嘿,我在我的主 xml 文件中使用 DrawerLayout,然后对于 Actionbar,我按照您的建议使用自定义布局。但是当我尝试使用您的代码时,由于 actionBar.setDisplayShowCustomEnabled(true); 我的 DrawerLayout 无法正常工作如果我不写这一行,那么我将无法在我的操作栏中看到自定义布局。请建议我正确的方法。我想同时使用两者。谢谢。 请看这个***.com/questions/17161609/…你对这个问题有什么想法吗?如果我找到了这个问题的解决方案,则无需使用自定义布局。请帮助我,我被困在这个问题上。谢谢。 但是我给出了错误,说不是这种方法(我的点击方法)并且应用程序关闭了为什么? 是的,我这样做,但我不知道为什么膨胀的布局不能达到那个。我以这种方式为我的操作栏创建自定义视图:@Override public boolean onCreateOptionsMenu(Menu menu) MenuInflater inflater = getSherlock().getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); menu.add(Menu.NONE, 0, Menu.NONE, "custom") .setActionView(R.layout.header) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);返回真; @DhawalSodhaParmar 你看到了吗?【参考方案2】: View cView = getLayoutInflater().inflate(R.layout.header, null);
cView.findViewById(R.id.btn_id).setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// Do stuff here.
);
actionBar.setCustomView(cView);
【讨论】:
以上是关于如何在自定义操作栏上获取 onClickListener() 事件的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?
在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow