我需要覆盖一个隐藏类(用@hide标记)的方法,该方法只在其包中可见。有没有办法扩展它?
更具体地说,我需要覆盖 android.widget.Editor 的getNextCursorOffset()
,因为该方法与ReplacementSpan
的效果不佳。
答案 0 :(得分:0)
您可以在项目中定义相同的包android.widget
。然后你可以扩展它:
public class ProjectSpecificEditor extends Editor {
// constructors et all
public int getNextCursorOffset() {
//...
}
}
但请注意,这是不鼓励的。即框架的下一个版本可能会更改某些类/方法签名。那么你只能怪自己。
答案 1 :(得分:0)
我从ryan gordon那里得到了主意
基本上,标记为@hide
的所有内容在编译框架时都会被删除,Android Studio会使用该框架来编译您的代码。您可以在\AppData\Local\Android\Sdk\platforms\android-xx\android.jar
中对其进行罚款。 ryan提出的建议是要么自己编译没有@hide
的android框架,要么从有根电话中获取已经编译的框架(因为@hide
不会影响实际电话中使用的代码)
我认为,更简单的选择是从.class
中提取android.jar
文件,使用任何Java字节码编辑器,然后添加缺少的方法。然后替换android.jar
中的文件。
但是,就像Tamas Rev所提到的那样,标记为@hide
的方法永远都不会被访问,因此不能保证它存在于较旧的版本中,或者行为在各个版本之间是一致的,或者将来存在!