天天看点

腾讯X5去分享 缓存 简单分析后记 

此方法只适用webView页面不会产生大的变化的情况下,请酌情谨慎使用

首先在分享的按钮一般只在横屏的时候出现,目前网上的说法都是说用标准横屏,但是作为一个标准懒人当然是用现成的X5横屏,所以我们要在横屏的时候调用我们设置分享隐藏的方法,即onConfigurationChanged调用时

@Override

public void onConfigurationChanged(Configuration newConfig) {

    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        orientation = 0;

        getAllChildViews(); //横屏

    } else orientation = 1;  //竖屏

}

getAllChildViews();就是我们的隐藏方法

这里说下思路

首先就是我们需要找到需要隐藏的ImageView的id,而现在我们对没有资源名的情况下自然是非常难找,所以我们需要把当前窗口的所有视图取出来(当然会担心耗时的问题,所以后面会把这个方法去掉)

这里就抄下百度的方法

         public List<View> getAllChildViews() {

             View view = this.getWindow().getDecorView();

             return getAllChildViews(view);

         }

         private List<View> getAllChildViews(View view) {

             List<View> allchildren = new ArrayList<View>();

             if (view instanceof ViewGroup) {

                 ViewGroup vp = (ViewGroup) view;

                 for (int i = 0; i < vp.getChildCount(); i++) {

                     View viewchild = vp.getChildAt(i);

                     allchildren.add(viewchild);

                     allchildren.addAll(getAllChildViews(viewchild));

                 }

            }

             return allchildren;

        }

在拿到所有view后,我们去遍历所有视图,判断是否是Imageview,,来找到我们需要的imageview

int i =0;
for (View cview : allchildren){
    if (cview instanceof ImageView
            && i > allchildren.size()/2
            && i< allchildren.size()
            ){
        cview.setVisibility(View.INVISIBLE);
    }
    i++;
}      

在依次对比几次后我们就可以定位到我们需要的imagview了

在拿到view后,我们就可以拿到view的id了,然后回到开头横屏方法那里直接从主视图里findbyid,然后setVisibility即可,然后取消掉我们遍历的方法,提升效率

View view = this.getWindow().getDecorView();
View view2 = view.findViewById(35);
if (view2!=null)
    view2.setVisibility(View.INVISIBLE);      

此方法只适用webView页面不会产生大的变化的情况下,请谨慎使用

腾讯X5去分享 缓存 简单分析后记 

后记

楼主能力有限,未能实现从id找到资源名的方法

public  void  geResId() {
    Field[] f;
    try {
        f = R.id.class.getDeclaredFields();
        for (Field id :f){
            Log.e("动态id","name:"+id.getName()+"----"+id.getInt(null) );
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }
}      

之后用反射去动态查找R.id.class也未找到我找到的id,通过

String str = getApplicationContext().getResources().getResourceName(view2.getId());      

从项目R文件未找到资源,感觉是包的问题,可能要到X5的包下去找,但是X5的jar文件并没有R文件,最后只能不了了之,凑合着用了

这两个方法就留给大家去尝试吧,如果你有好的方法请留言,给遇到麻烦的网友和我这个菜鸡一点方法