前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OnClick 的另一种书写

OnClick 的另一种书写

原创
作者头像
木子杂志
修改2020-08-04 09:55:37
7250
修改2020-08-04 09:55:37
举报
文章被收录于专栏:木子杂志木子杂志
前言

在自定义 View 时,每个 view 里面一般都会写一次 OnClick 事件

今天使用另外一种方式将点击事件从我们的 activity 或者自定义 View 中抽取出来

利于 java8 中一个特性 双冒号:: 关键字

:: 关键字

java 8 中:: 关键字可以用来引用类的方法

利于这一点我们用另一个风格写一下 android 中的点击事件

另一种方式书写 OnClick
代码语言:txt
复制
public class ItemClickHandler {

    public static final View.OnClickListener INSTANCE = ItemClickHandler::onItemClick;

    private static void onItemClick(View v) {

        switch (v.getId()) {
            case R.id.btn_1:
                Toast.makeText(v.getContext().getApplicationContext(), "button1", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_2:
                Toast.makeText(v.getContext().getApplicationContext(), "button2", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_3:
                Toast.makeText(v.getContext().getApplicationContext(), "button2", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }

}

这样我们就可以实现在一个地方定义,别处使用

代码语言:txt
复制
public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        findViewById(R.id.btn_1).setOnClickListener(ItemClickHandler.INSTANCE);

    }
}

public class NavigationView extends RelativeLayout {

    protected void bindClick() {
        findViewById(R.id.btn_2).setOnClickListener(ItemClickHandler.INSTANCE);
    }
}


public class BottomView extends RelativeLayout {

    protected void bindClick() {
        findViewById(R.id.btn_3).setOnClickListener(ItemClickHandler.INSTANCE);
    }
}
出处

【packages/apps/Launcher3/src/com/android/launcher3/touch/ItemClickHandler.java】

【---> ItemClickHandler.java】

代码语言:txt
复制
/**
 * Class for handling clicks on workspace and all-apps items
 */
public class ItemClickHandler {

    /**
     * Instance used for click handling on items
     */
    public static final OnClickListener INSTANCE = ItemClickHandler::onClick;

    //点击事件
    private static void onClick(View v) {
        // Make sure that rogue clicks don't get through while allapps is launching, or after the
        // view has detached (it's possible for this to happen if the view is removed mid touch).
        if (v.getWindowToken() == null) {
            return;
        }

        Launcher launcher = Launcher.getLauncher(v.getContext());
        if (!launcher.getWorkspace().isFinishedSwitchingState()) {
            return;
        }

        Object tag = v.getTag();
        if (tag instanceof ShortcutInfo) {
            onClickAppShortcut(v, (ShortcutInfo) tag, launcher);
        } else if (tag instanceof FolderInfo) {
            if (v instanceof FolderIcon) {
                onClickFolderIcon(v);
            }
        } else if (tag instanceof AppInfo) {
            //点击 icon 启动应用
            startAppShortcutOrInfoActivity(v, (AppInfo) tag, launcher);
        } else if (tag instanceof LauncherAppWidgetInfo) {
            if (v instanceof PendingAppWidgetHostView) {
                onClickPendingWidget((PendingAppWidgetHostView) v, launcher);
            }
        }
    }
  //...
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • :: 关键字
  • 另一种方式书写 OnClick
  • 出处
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档