① android之隐藏api介绍
..
Android P 引入了针对非 SDK 接口(俗称为隐藏API)的使用限制。这是继 Android N上针对 NDK 中私有库的链接限制之后的又一次重大调整。
从今以后,不论是native层的NDK还是 java层的SDK,我们只能使用Google提供的、公开的标准接口。这对开发者以及用户乃至整个Android生态,当然是一件好事。
但这也同时意味着Android上的各种黑科技有可能会逐渐走向消亡。
公共 SDK 接口是在 Android 框架软件包索引 中记录的那些接口
从 Android Pie 开始,对某些隐藏类、方法和字段的访问受到限制在 Pie 之前,通过简单地使用反射来使用这些隐藏的非 SDK 组件非常容易。
但是,现在当尝试访问时,面向 API 28 (Pie) 或更高版本的应用程序将遇到 ClassNotFoundException、NoSuchMethodError 或 NoSuchFieldException Activity#createDialog() 。
先来看看系统是如何实现这个限制的。
通过反射或者JNI访问非公开接口时会触发警告/异常等,那么不妨跟踪一下反射的流程,看看系统到底在哪一步做的限制。
先来看一下 java.lang.Class.getDeclaredMethod(String) :
其中看一下 ShouldBlockAccessToMember 的调用,如果它返回false,那么直接返回 nullptr ,上层就会抛 NoSuchMethodXXX 异常;也就触发系统的限制了。
源码如下:
继续跟踪下 GetMemberAction方法 :
继续跟踪GetMemberActionImpl方法:
其中调用到了
只要 IsExempted 方法返回 true,就算这个方法在黑名单中,依然会被放行然后允许被调用。
IsExempted 方法:
继续跟踪传递进来的参数 runtime->GetHiddenApiExemptions() 发现也是 runtime 里面的一个参数.
这样就可以直接修改 hidden_api_exemptions_ 绕过去限制。
Java 层的,有一个对应的 VMRuntime.setHiddenApiExemptions 方法,通过 VMRuntime.setHiddenApiExemptions 设置下豁免条件,就能愉快滴使用反射了。
IsExempted 方法里面调用 DoesPrefixMatch 方法。DoesPrefixMatch是对方法签名进行前缀匹配。所有Java方法类的签名都是以 L 开头,这样就可以直接传个 L 进去,所有的隐藏API全部被赦免了!
另一种绕过 Android P以上非公开API限制的办法
② android怎么设置组件不可见
通常控件的可见与不可见分为三种情况。
第一种 gone 表示不可见并且不占用空间
第二种 visible 表示可见
第三种 invisible 表示不可见但是占用空间
可见与不可见的表现形式有两种。
在布局文件中:
[html] view plain
android:visibility="gone"
android:visibility="visible"
android:visibility="invisible"
在代码中:
[java] view plain
setVisibility(View.Gone);
setVisibility(View.VISIBLE);
setVisibility(View.INVISIBLE);
③ android里怎么实现在代码中把一个布局给隐藏掉
设置布局的顶级View的visibility属性View.VISIBLE和View.GONE
android:visibility此属性意思是此视图是否显示,
其有三个属性:visible显示;invisible显示黑背景条;gone不显示
Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:LinearLayout (线性布局),FrameLayout(框架布
局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。他们都是ViewGroup的子类,当然也是View的子类。
一、LinearLayout
线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。
linearLayout中有一个重要的属性 android:layout_weight="1",这个weight在垂直布局时,代表行距;水平的时候代表列宽;weight值越大就越大。
线形布局中预览和真机中完全一样。
TextView占一定的空间,没有赋值也有一定的宽高,要特别注意。
二、FrameLayout
FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。
三、AbsoluteLayout
AbsoluteLayout 这个布局方式很简单,主要属性就两个 layout_x 和 layout_y 分别定义 这个组件的绝对位置。 即,以屏幕左上角为(0,0)的坐标轴的x,y值,当向下或向右移动时,坐标值将变大。AbsoluteLayout 没有页边框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用 AbsoluteLayout ,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。
四、RelativeLayout
相对布局可以理解为某一个元素为参照物,来定位的布局方式。
android:layout_方向 = id 表示 在这个id对应的控件的方向上(上|下)
android:layout_align方向 = id 表示和这个控件的(上下左右)对齐
android: layout_to方向Of = id 表示在这个控件的 左或者右
eg:
android:layout_below="@id/la1"/>
将当前控件放置于id为la1 的控件下方。
android:layout_alignParentRight="true"
使当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。
android:layout_marginLeft="10dip"
使当前控件左边空出相应的空间。
android:layout_toLeftOf="@id/true"
使当前控件置于id为true的控件的左边。
android:layout_alignTop="@id/ok"
使当前控件与id为ok的控件上端对齐。
五、TableLayout
表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。每个TableRow 都会定义一个 row (事实上,你可以定义其它的子对象,这在下面会解释到)。TableLayout 容器不会显示row 、cloumns 或cell 的边框线。每个 row 拥有0个或多个的cell ;每个cell 拥有一个View 对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML 中的不一样。
④ 在android中,在main.xml中有一个ProgressBar进度条组件和一个button按钮,在初始状态让该进度条隐藏怎么
很简单,先在mian.xml中把ProgressBar的visibility设置为invisible。然后在java文件中通过findViewById()找到ProgressBar的ID,假设为“progressBar”,最后在button的监听函数中写上progressBar.setVisibility(View.VISIBLE);就搞定了。
⑤ android的listview一键隐藏所有子项中的某一个组件
同时隐藏所有Items比隐藏单一的一个简单点,直接一个boolean去控制就行。
在getView里面去判断这个值是true或false,来决定tv1和tv2的显示/隐藏。
当你在ListView的上面,比如你是一个按钮去实现的,那就是第一次点击后,将boolean设成true,然后adapter.setNotifyChanged让listView再去更新一下,相当于getView再走一次,就会重新判断boolean去显示或者隐藏tv1和tv2。你再点击按钮,同样去修改boolean值,再adapter更新一下。
⑥ 第二章:Android组件讲解-5
菜单
菜单是UI设计中经常使用的组件,提供了不同功能分组展示的能力,在人机交互中提供了人性化的操作。
Android中菜单分为两种类型:
选项菜单(Option Menu)
上下文菜单(Context Menu)
选项菜单
创建选项菜单的3个步骤:
重写Activity的onCreateOptionsMenu()方法,当第一次打开菜单时该方法被自动调用。
调用Menu的add()方法添加菜单项(MenuItem)
当菜单项被选择时,重写Activity的onOptionsItemSelected()方法来响应事件。
上下文菜单
上下文菜单的创建步骤:
覆盖Activity的onCreateContextMenu()方法,调用Menu的add()方法添加菜单项(MenuItem)。
覆盖onContextItemSelected()方法,响应菜单单击事件。
在Activity的onCreate()方法中,调用registerForContextMenu()方法,为视图注册上下文菜单。
长按控件
弹出式菜单(popupMenu)
弹出式菜单的创建步骤:
在res下创建menu文件夹,创建pop_menu.xml。
创建new PopupMenu(context,btn)。
调用getMenuInflater.inflater(R.menu.pop_menu,pop.getMenu())。
调用popmenu.show()
在res下穿件menu文件夹,
创建pop_menu.xml
ActionBar
一、显示和隐藏
(1)获取ActionBar
ActionBar actionBar = getSupportActionBar();
(2)判断是否显示
actionBar.isShowing()
(3)隐藏
actionBar.hide();
(4)显示
actionBar.show();
二、添加图标
1.always:总是显示在界面上
2.never:不显示在界面上,只让出现在右边的三个点中
3.ifRoom:如果有位置才显示,不然就出现在右边的三个点中
(1)res/menu创建menu_action.xml
(2)重写onCreateOptionsMenu
(3)重写onOptionsItemSelected
三、添加返回键
(1)onCreate方法添加
actionBar.setDisplayHomeAsUpEnabled(true);
(2)onOptionsItemSelected添加case
case android.R.id.home:
finish();
RecyclerView
1、添加依赖
implementation 'androidx.recyclerview:recyclerview:1.1.0'
2、初始化数据
for (int i= 0;i<20;i++){
list.add("标题"+i);
}
3、获取组建
recycleview = findViewById(R.id.recycleview);
4、设置方向
//第一个参数:Context
//第二个参数:方向 RecyclerView.HORIZONTAL || VERTICAL
//第三个参数:是否倒叙false
LinearLayoutManager manager =
new LinearLayoutManager
(RecyclerActivity.this,RecyclerView.HORIZONTAL,false);
recycleview.setLayoutManager(manager);
5、新建一个类MyRecyclerAdapter
在类里创建静态方法MyViewHolder 继承 RecyclerView.ViewHolder
6、MyRecyclerAdapter 继承
RecyclerView.Adapter
7、创建构造方法
8、实现里边的方法
public MyViewHolder onCreateViewHolder
9、实现里边的方法
MyViewHolder 获取组建
10、实现里边的方法
public void onBindViewHolder
public int getItemCount
11、Activity里创建MyRecyclerAdapter,并设置
MyRecyclerAdapter adapter = new MyRecyclerAdapter(this,list);
recycleview.setAdapter(adapter);
12、MyRecyclerAdapter 创建接口 OnMyChildClick
并且声明
并且提供设置接口的方法
13、RecyclerActivity的页面实现接口OnMyChildClick,重写里边的方法
14、RecyclerActivity的页面设置完适配器,设置OnMyChildClick
15、MyRecyclerAdapter
onAttachedToRecyclerView 方法
获取到recyclerView
16、MyRecyclerAdapter
public MyViewHolder onCreateViewHolder 方法
获取到view后设置点击事件
⑦ android 应用开发怎么在应用中隐藏魅族的smarkbar组件
您好,
如果是最新版Flyme3或者Flyme4,进入设置——辅助功能里就有“智能隐藏smartbar”选项的,开启后即可隐藏。
⑧ android 中下图是那个组件如何实现
两种方法实现,
一种是现在用的比较多的,左边一组view
控件,右边则通过Fragment来实现,切换左边的组件来实现切换右边的fragment。
第二种就通过layout来实现,可以将右边布局对应左边每个item实现一个布局,切换到那个显示对应的布局,隐藏其他两个(这个是对于数据内容比较少的情况)
⑨ android能否让一个布局或一个组件完全隐藏并且不占位置
setVisible(VIew.GONE);//隐藏 并且不占用界面空间
setVisible(VIew.VISIBLE);//控件显示
setVisible(VIew.INVISIBLE);//控件隐藏 占用界面空间
⑩ android 之 如何让app没有图标
首先我们要获得 PackageManager 的对象。
然后我们获取本应用的名称
最后调用 pm的 设置组件使能 隐藏应用图标
显示应用图标
大家可以点个关注,告诉我大家想要深入探究哪些问题,希望看到哪方面的文章,我可以免费给你写专题文章。。哈哈。。。
希望大家多多支持。。你的一个关注,是我坚持的最大动力。。