Android Proguard - 如何保持 onClick 处理程序仅从 XML 布局引用

发布于 2024-11-13 08:11:51 字数 631 浏览 4 评论 0原文

在我的 Android 应用程序中,我通常不会在代码中创建视图的单击处理程序,而是依赖于在 XML 布局文件中指定它的能力,如下所示:

   <Button
        ....
        android:onClick="onSearchClicked"
       ...../>

然后在 Activity 中使用该方法,如下

    public void onSearchClicked( View v ) {
    ........}

所示 :在我自己的代码中没有明显引用此方法。

当为生产版本运行 Proguard 时,它似乎删除了此方法并且单击失败。

我可以在我的 proguard 配置文件中添加什么来避免这种情况,而不会迫使我重命名所有这些方法?

  • 我可以添加到方法中并让 proguard 注意到的注释吗?
  • 以某种方式指定从 xml 引用的这些类型的方法?
  • 我想我可以在代码中添加错误的引用,但如果可以的话我想避免这种情况,因为我不会总是记得将其放入!

我浏览了 Android 的 proguard 示例,但看不到任何满足此特殊需求的内容。

In my Android app I ofter don't create a View's on-click handler in code, but rely on the ability to specify it in the XML layout file, like this:

   <Button
        ....
        android:onClick="onSearchClicked"
       ...../>

And then have the method in the Activity like this:

    public void onSearchClicked( View v ) {
    ........}

Meaning there is no obvious reference to this method in my own code.

When running Proguard for a production release it seems to remove this method and the on-click fails.

What can I add to my proguard config file to avoid this that won't oblige me to rename all these methods?

  • An annotation I could add to the method and have proguard take notice of?
  • Somehow specify these types of methods referenced from xml?
  • I suppose I can add a false reference in the code, but would like to avoid that if I can as I won't always remember to put it in!

I have looked through the proguard examples for Android and can't see anything for this particular need.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

谜泪 2024-11-20 08:11:51

这似乎是最好的答案,因为它对于此类方法的命名是 100% 稳健的:

# This will avoid all the onClick listeners referenced from XML Layouts from being removed
-keepclassmembers class * extends android.app.Activity { 
       public void *(android.view.View); 
}

希望它有帮助。

This seems to be the best answer, as it is 100% robust to naming of such methods:

# This will avoid all the onClick listeners referenced from XML Layouts from being removed
-keepclassmembers class * extends android.app.Activity { 
       public void *(android.view.View); 
}

Hope it helps.

淡笑忘祈一世凡恋 2024-11-20 08:11:51
-keepclasseswithmembers class * {
   public void onSearchClicked(android.view.View );
}

但请从 proguard 文档中仔细检查:
http://proguard.sourceforge.net/index.html#/manual/refcard .html

-keepclasseswithmembers class * {
   public void onSearchClicked(android.view.View );
}

but double check it from proguard doc :
http://proguard.sourceforge.net/index.html#/manual/refcard.html

小镇女孩 2024-11-20 08:11:51

我使用:

-keepclassmembers class * extends android.app.Activity { 
       public void on*Click(android.view.View); 
}

然后我将所有 onClick 方法命名为:onCancelBtnClick()、onBackgroundClick() 等。

I use:

-keepclassmembers class * extends android.app.Activity { 
       public void on*Click(android.view.View); 
}

and then I name all onClick methods like: onCancelBtnClick(), onBackgroundClick(), etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文