安卓小工具方法

HttpCanary抓包使用方法——一款在安卓手机上抓APP或者小程序的小工具 HttpCanary抓包使用方法——一款在安卓手机上抓APP或者小程序的小工具 现在介绍一款工作中用到的可以在安卓手机上抓APP或者小程序的小工具 ##1.安装HttpCanary APP 2.未开始抓包的软件首页 3.设置抓包的目标软件/目标IP域名 1)点击左上角按钮进入设置页面: 2)抓包设置——目标应用 3)抓包设置——目标Host 4.设置好要抓的目标应用和host之后,返回首页... 阅读详情
  1. 获取状态栏高度:
/**
     * 
     * @return 状态栏高度
     */
    public static int getStatusBarHeight() {
         return Resources.getSystem().getDimensionPixelSize(Resources.getSystem().getIdentifier("status_bar_height", "dimen", "android"));
    }

2.px转dp

/**
     * px to dip
     * 
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

3.dp转px

/**
     * dip to px
     * 
     * @param context
     * @param dpValue
     * @return
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

4.获取sd卡路径

/**
     * 获取sd卡路径
     * @param mContext
     * @return
     */
    public static File getFileDir(Context mContext) {
        File cacheDir = null;

        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            cacheDir = mContext.getExternalFilesDir(null);
        } else {
            cacheDir = mContext.getFilesDir();

        }
        return cacheDir;
    }

5.获取文件夹路径(不存在则创建)

/**
     * 
     * @param mContext
     * @param filename
     * @param forlderName
     * @return 文件夹路径
     */
    public static String makeFilePath(Context mContext, String forlderName) {
        File cacheDir = new File(getFileDir(mContext), forlderName);
        if (!cacheDir.exists()) {
            cacheDir.mkdirs();
        }
        return cacheDir.getPath();
    }

6.读取文件中的文本内容

 try {
    // 获取到了文件
    FileInputStream fileInputStream = new FileInputStream(getFilesDir().getAbsolutePath() + "/apps.txt");
    byte[] b = new byte[fileInputStream.available()];
    fileInputStream.read(b);
    String allInfos = new String(b);
    Toast.makeText(this, allInfos, 0).show();
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();

}

7.得到屏幕宽度

/**
     * 
     * @return 屏幕宽度(单位:px)
     */
    public static int getScreenWidth(Activity mActivity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        mActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.widthPixels;
    }

8.得到屏幕高度

/**
     * 
     * @return 屏幕高度(单位:px)
     */
    public static int getScreenHeight(Activity mActivity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        mActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.heightPixels;
    }

9.将字符串存到文件

/**
     * 将要备份的应用信息存放在文件里
     * @param info 要备份的应用信息
     */
    public static void saveAllInfos(Activity mActivity, String info) {
        if (info != null) {
            try {
                FileOutputStream outStream = mActivity.openFileOutput(Constant.NAME_BACKED_APPS, Context.MODE_PRIVATE);
                outStream.write(info.getBytes());
                outStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

10.日期相关

public class DateUtils {

    public static String FORMAT_YYYY_MM_DD = "yyyy-MM-dd";

    public static String FORMAT_CHINESE_MM_DD="MM月dd日";

    public static String fORMAT_YYYY_MM_DD_HH_MM_SS="yyyy/MM/dd HH:mm:ss";

    public static String FORMAT_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";

    /**
     * 将日期字符串转换为日期
     * 
     * @param sourceDate
     *            :待转换的日期字符串
     * @param fomart
     *            :日期字符串的格式
     * @return
     */
    public static Date convertToDate(String sourceDate, String fomart) {
        Date targetDate;
        try {
            targetDate = (new SimpleDateFormat(fomart)).parse(sourceDate);
        } catch (ParseException e) {
            targetDate = new Date();
        }
        return targetDate;
    }

    /**
     * 将日期转换为指定格式字符串
     * 
     * @param sourceDate
     *            :待转换的日期
     * @param fomart
     *            :日期字符串的格式
     * @return
     */
    public static String toString(Date sourceDate, String fomart){
        return (new SimpleDateFormat(fomart)).format(sourceDate);
    }

    /**
     * 将日期字符串转换为指定格式字符串
     * 
     * @param sourceDate
     *            :待转换的日期
     * @param sourceFomart
     *            :待转换日期的格式        
     * @param fomart
     *            :转换后日期字符串的格式
     * @return
     */
    public static String toString(String sourceDate,String sourceFomart, String fomart){
        Date tempDate=DateUtils.convertToDate(sourceDate, sourceFomart);
        return (new SimpleDateFormat(fomart)).format(tempDate);
    }

    public static String getCurrentTime(String format) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault());
        String currentTime = sdf.format(date);
        return currentTime;
    }

    /**
     * 
     * @return 当前时间
     */
    public static String getCurrentTime() {
        return getCurrentTime(DateUtils.fORMAT_YYYY_MM_DD_HH_MM_SS);
    }
}

11.获取手机IMEI

String imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId();

12.获取剩余容量和总容量:

/**
     * @return SD卡剩余容量
     */
    public static long getAvailableSDSize(){
        //取得SD卡文件路径
        File path = Environment.getExternalStorageDirectory(); 
        StatFs sf = new StatFs(path.getPath()); 
        //获取单个数据块的大小(Byte)
        long blockSize = sf.getBlockSize(); 
        //空闲的数据块的数量
        long freeBlocks = sf.getAvailableBlocks();
        //返回SD卡空闲大小(MB)
        return (freeBlocks * blockSize) >> 20;
    }

    /**
     * 获取SD卡总容量
     * @return
     */
    public static long getSDSize(){
        File path = Environment.getExternalStorageDirectory(); 
        StatFs stat = new StatFs(path.getPath()); 
        long blockSize = stat.getBlockSize(); 
        long availableBlocks = stat.getBlockCount();
        return availableBlocks * blockSize; 
    }

    /**
     * 获取剩余磁盘空间(单位:MB)
     * @return
     */
    public static long getAvailableDiskSize() {
        File root = Environment.getRootDirectory();  
        StatFs sf = new StatFs(root.getPath());  
        long blockSize = sf.getBlockSize();  
        long availCount = sf.getAvailableBlocks();  
        return (availCount * blockSize) >> 20;
    }

13.ScrollView嵌套ListView获取ListView总高度:

comments.addAll(JsonHelper.convertList(JsonHelper.tojson(response.getResult()), PostComment.class));
adapter.setComments(comments);
int listViewHeight = 0;
if(listView.getLayoutParams() != null) {
    for (int i = 0, count = adapter.getCount(); i < count; i++) {
        View listItem = adapter.getView(i, null, listView);
        listItem.measure(0, 0);
        listViewHeight += listItem.getMeasuredHeight();
    }
    listView.getLayoutParams().height = listViewHeight;
    listView.setLayoutParams(listView.getLayoutParams());
    listView.requestLayout();
}

14.判断ListView的内容向上飞还是向下飞

listView.getRefreshableView().setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        final ListView lw = listView.getRefreshableView();
        if(scrollState == 0) {
            final int currentFirstVisibleItem = lw.getFirstVisiblePosition();
            if (currentFirstVisibleItem > mLastFirstVisibleItem) {
                Log.i("a", "文字向上飞");
                ObjectAnimator.ofFloat(ll_article_detail_bottom, "translationY", toolBarBotom, toolBarBotom + toolBarHeight).setDuration(1000).start();
            } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
                Log.i("a", "文字向下飞");
                ObjectAnimator.ofFloat(ll_article_detail_bottom, "translationY", toolBarBotom + toolBarHeight, toolBarBotom).setDuration(1000).start();
            }
            mLastFirstVisibleItem = currentFirstVisibleItem;
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

    }
});

15.ScrollView要嵌套ListView: 推荐在一个listview里面做。把握好addHeaderView(view, null, false)跟addFooterView,足以应对了。

16.WebView在xml设置android:scrollbars=”none”不显示滚动条。

17.先发送登录api,后存jsession

18.Fragment的setUserVisibleHint方法类似于Activity的onResume

19.http的请求方式 get post put delete 分别对应 查 改 増 和 删。

20.继承了Application的类要在清单文件的application节点配好类名才会被调用。但是继承Application的类在清单文件配置的时候在一些集成开发环境ide要省略前面的点。

21.替换Fragment

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(android.R.id.content, PlaceHolderFragment.newInstance()).commit();

22.缓存也是存数据库

23.Fragment往子Fragment传参,子Fragment的私有变量提供set方法。

24.spinner使用:

adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, years); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

25.按钮边框:

<stroke
    android:width="1dp"
    android:color="@color/glh_grey_line"
    android:dashWidth="0dp"
    android:dashGap="2dp" />

26.AutoCompleteTextVIew

27.如果arraylist是null,则不能调用clear方法

28.wv_home_content.loadUrl(file:///android_asset/loading.html);
gif图片路径

29.从服务器传过来的json数据中,value如果是以数字开头的话,用jsonnode直接get会得到用双引号括起来的value,例如”1eabcd”,所以要想得到原来的值,应该调用substring函数将value前后的双引号去掉。

30.viewpager如果用同一个adapter图片无论如何都无法更新,就用另一个viewpager。

31.安卓版本比较android.os.Build.VERSION.SDK_INT >= 18

32.在子线程里setText不生效可能是子线程不能刷新界面,要刷新主界面。现在才知道是不能在子线程中操控控件。正确的做法应该是在子线程中发送消息给窗口。让界面线程自己管理界面。

33.写ActivityManager的目的是用于那些有“退出”按钮的应用,如果没有退出按钮,说明用户默许我们一步一步退出应用。

34.编译的时候没有错,运行的时候却报找不到类的错误,很可能是版本不支持。

35.获取WebView当前处理的url

public boolean shouldOverrideUrlLoading(WebView view, String url) {
     view.loadUrl(url);
     // 记住当前的URL
     currentLeftUrl = url;
     // 由当前的WebView处理跳转
     return true;
 }

36.设置全屏、没有标题:

super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_loading);

37.拨打电话的时候报activitynotfoundexception,记得要把”tel:”加上:

Intent intent=new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + logisticsTelephone));
startActivity(intent);

38.ImageView展示本地图片:

ImageView imageView = new ImageView(mActivity);
// 展示本地图片
imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.logistics_default));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
images.add(imageView);
adapter.notifyDataSetChanged();

39.对话框

new AlertDialog.Builder(ReceivedGiftDetailActivity.this).setTitle(R.string.label_reject_gift).setMessage(R.string.msg_gift_rejected_confirm)
 .setPositiveButton(R.string.msg_more_version_yes, new DialogInterface.OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
 new DealGiftTask(REJECT_GIFT).execute();
 }
 }).setNegativeButton(R.string.msg_more_version_no, null).show();

40.本地图片Drawable转Bitmap

res= getResources();//activity的方法
BitmapFactory.decodeResource(res, id);//id = R.drawable.x

41.相对布局toRightOf 的时候No resource found 找不到id,是因为要将用到的id写在前面,或者无论何时都带@+

42.明明在xml中配置了activity,一切也正常,为什么还是报找不到activity的空指针异常?很有可能是清单文件的application的theme限定死了,而某些activity用到了getActionBar方法,结果为空,就找不到了。也有可能是activity.xml文件中context限定了。

43.三种方法得到实例化的layout的方法:

LayoutInflater inflater = getLayoutInflater(); 
LayoutInflater inflater = (LayoutInflater) layout
mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,null);
LayoutInflater.from(mContext).inflate(R.layout.item_message_list, null);

44.TextView增加如下属性实现走马灯:

android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"

45.要想RadioButton在RadioGroup文字图片都居中,除了button为null之外,background也要null
代码示例

46.ImageButton加上android:background=”@null”可以去除边框

47.获取状态栏高度

public static int getStatusBarHeight() {
 return Resources.getSystem().getDimensionPixelSize(
 Resources.getSystem().getIdentifier("status_bar_height", "dimen", "android"));
}

48.按钮setTag, Button可以set一个tag,然后在onClick事件里面v.getTag就可以得到相应的对象或字符串。

holder.checkGiftButton.setTag(myGift);
// 点击查看礼物
holder.checkGiftButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (v.getTag() instanceof MyGift) {
            MyGift myGift = (MyGift) v.getTag();
            Intent mIntent = new Intent();
            mIntent.putExtra("gift_id", myGift.getGift_id());
            mIntent.setClass(context,
            ReceivedGiftDetailActivity.class);
            context.startActivity(mIntent);
        }
    }
});

49.字符串插入变量值
tv_expired_time.setText(String.format(getString(R.string.label_expired_time), DateUtils.getCurrentTime()));

50.滑动开关

<com.woyoli.views.WiperSwitch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="10dp" />

51.view也可以直接setTag

Holder holder = new Holder();
view.setTag(holder);
private static class ViewHolder {
    ImageView giftImage;
    TextView giftTitle;
    TextView giftNumber;
    Button checkGiftButton;
    Button shareButton;
    CircularImage userIcon;
    int position;
}

52.保证旋屏不会重走生命周期:

<activity
    android:name=".activity.ReceivedGiftDetailActivity"
    android:configChanges="screenSize|orientation|keyboardHidden|navigation"
    android:label="@string/app_name"
    android:screenOrientation="portrait" />

53.width或height要设为0dp权重才会忽略margin的space

54.由drawable的id得到drawable

allGiftButton.setBackground(getResources().getDrawable(R.drawable.button_my_gift_all_pressed));

55.要第二次进去头像才是圆的,这是因为有时候网络比较差,无法瞬间加载所有的图片,这时候就要在display的回调函数(callback)里面设置图片,以保证图片是已经缓冲好了。

56.LinearLayout是从上到下分配空间的,比如vertical的话,假如下部的控件的宽高都是match_parent,但是实际效果是除开上部分之外的其余空间。

57.只有文字用ArrayAdapter,有本地图片SimpleAdapter,有网络图片用BaseAdapter。

58.点击popupwindow之外其他地方隐藏popwindow:

neighborhoodWindow.setOutsideTouchable(true);
neighborhoodWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), Bitmap.createBitmap(dm.widthPixels, dm.heightPixels, Bitmap.Config.ALPHA_8)));

59.popupwindow在代码里加上popupwindow.setBackgroundDrawable(null);就可以去除边框,并且还保留原来的背景。

60.自定义Adapter在监听onItemClickListener的时候,总是被子控件拦截,干脆就用子控件来实现监听,而且子控件要match_parent。

61.FrameLayout解决layout点击事件被屏蔽:节点加上

android:descendantFocusability="blocksDescendants"

62.illness_TV.setTextColor(R.color.gray); 这个错了你这样用变成 颜色指是 R.color.gray指示的ID值了 应该是

illness_TV.setTextColor(this.getResources().getColor(R.color.gray));

63.左侧导航菜单,底部菜单,底部悬浮菜单,滑动菜单。

64.Android底部导航栏怎么做?ViewPager+RadioGroup+RadioButton+frament

65.有人说,不要用viewpager了,你可以用actionbar+Fragment实现。

66.Selector示例

<?xml version="1.0" encoding="utf-8"?> xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/checkbox_checked" android:state_checked="true"></item>
    <item android:drawable="@drawable/checkbox_checked" android:state_selected="true"></item>
    <item android:drawable="@drawable/checkbox_checked" android:state_pressed="true"></item>
    <item android:drawable="@drawable/checkbox_unchecked"></item>
</selector> selector>

67.CheckBox示例:

<CheckBox
    CheckBoxandroid:id="@+id/cb_agreeRegister"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:button="@null"
    android:checked="true"
    android:drawablePadding="5dp"
    android:drawableLeft="@drawable/selector_customed_checkbox" />

68.RelativeLayout中Button靠底部对齐,然后清单文件中设置activity为android:windowSoftInputMode=”adjustPan”就可以实现按钮总在软键盘上方

69.友盟既有统计又有推送:
先master后secret

<meta-datameta-data
android:name="UMENG_MESSAGE_SECRET"
android:value="ivufpvhp8bh51tsntazsgjyotwhg5ppn" >
</meta-data>
<meta-data
android:name="UMENG_MESSAGE_SECRET"
android:value="9fe0a415186f4e813d694970ffa04fc4" >
</meta-data>

70.Fragment嵌套问题在fragment里还有fragment的话,里面要用getChildFragmentManager()来获取fragmentManager

71.去掉EditText的下划线:

android:background="@null"

72.查看安卓系统是否支持ble

PackageManager pm = getPackageManager();
boolean isBT = pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
boolean isBLE = pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);

73.如果Activity继承了BaseActivity,只让父类接管onBackPressed,那么iv_back.setOnClickListener(new OnClickListener…),不能是this

74.出现onItemClickListener不能响应,原因可能有多种,本人总结了有两种情况,一种是isEnable中返回值为false导致不能点击和选择,一种是因为item中有了checkable或者button类(子类)控件导致了item的焦点失去,从不能响应。

75.将listview的分隔线去掉:

listview.setDividerHeight(0);

76.intentFeedback.putExtra(Constant.LOAD_URL_KEY, moreInfo.getFollow());

77.listview的adapter往下滚再往上滚UI会刷新(变化),可能因为switch没有处理好所有的情况,要处理所有情况并在default做一些默认的操作。

78.透明颜色:#000000
帧布局、PopupWindow(是一个widget,也可以理解为一个ViewGroup,可以放各种布局、控件)、ListPopupWindow

79.不同的xml文件可以有相同的id

80.最小和最大高度一样就是准确的高度了。

81.
ViewStub
FragmentTabs

82.在其他地方开发的Android项目,不自动编译,在清单文件更改了安卓最高版本,更改了编码格式为UTF-8,还是不行,这时候右键project,properties,Java build path,order and export,把本机的android sdk版本勾选上即可。有时候还要更改java jdk版本号。

83.当前变量获得焦点,其他地方没有变暗,默认的java视图下,在工具栏上应该会有一个Toggle Mark Occurency的按钮,选中就可以了。

84.string.xml中:
UI的:label_开头
消息的:msg_开头

85.android:id=”@+id/btn”,表示在R.java文件里面新增一个id为btn的控件索引,最常用的一种声明控件id的方式。android:id=”@android:id/tabhost”,表示引用的是系统已有的ID,在对应的sdk目录下的ids.xml里面。一般外部不去调用,是组件内部调用的时候使用。.android:id=”@id/btn” ,表示引用一个已经存在的ID,在R.java里面的,比如我们自己建了一个ids.xml,里面声明了一组id,其中一个是btn,那么你就可以这样引用了。

86.T 后面要用的话 必须都是 T? 后面要用 就不会有限制但是对于泛型本身而言。没有啥本质区别。

87.你在Xx类里定义了一个带参数的构造方法,那么这个Xx类就没有无参数的构造方法了。 子类在继承父类时,如果没有相同的带参构造方法,那么他就需要在其构造方法中明确的通过super()调用父类的带参构造方法,否则构造不出父类,从而也构造不出他自己了。 你如果在父类中写个不带参数的构造方法,就可以不用实现父类的带参构造方法了。
如果父类的构造函数无参,子类的构造函数可以有参也可以无参,但是子类有参的时候要调用父类的构造函数;如果父类的构造函数有参,那么子类的构造函数一定要有参。

88.一个类里面有另外一个类的对象,叫做聚合。

89.全屏:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

90.四张在线图片:
http://url.cn/XhlEfM
http://url.cn/UZz9Hy
http://url.cn/dPqnyF
http://url.cn/Z0Er2u

91.想在ViewPager切换的时候不刷新WebView,就设置缓存页数为Tab的总页数就行了。试试viewPager.setOffscreenPageLimit(3); 这个是设置viewPager的缓存页数

92.webview不能直接设高度
把你这个webview放到一个layout中,如LinearLayout (在你xml中定义)。 LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(w, l); ll.setLayoutParams(lp); ll.addView(webview); 就可以了

93.测量组件高度

RadioGroup mRadioGroup = (RadioGroup) mActivity.findViewById(R.id.rg_bottom);
mRadioGroup.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
bottomTabHeight = mRadioGroup.getMeasuredHeight();

94.要想TextView有按下效果,必须设置

android:clickable="true"

95.要想把包裹内容的栏放在底部,其余为一个整体在上面除了用帧布局的话,相对布局可能就要计算高度然后为内容设定高度了。

96.其实,在res文件夹下添加资源会在R文件中添加该资源的引用,如果该资源没有被使用到,也一样会把该资源打包进安装程序中。

97.最有效的:先导入附加的library,再导入目标项目,然后右击项目,property,安卓版本要对应,最主要的是add library里把附加的library添加进来。可能要在AndroidManifest.xml中修改最低版本号

98.PS:右击图层,转换为智能对象,编辑对象,就可以保存图片。

99.每次打开一个Activity都要add一下,虽然在点击后退的时候finish掉了,但是退出整个程序的时候还是要遍历fininsh掉。

100.有退出按钮:
1.记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
2.发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
3.递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。为了编程方便,最好定义一个Activity基类,处理这些共通问题,也就是第一种。

101.获取控件高度:

toolBarHeight = getApplicationContext().getResources().getDimensionPixelSize(R.dimen.button_height);

102.安卓获取SD卡路径

String path = android.os.Environment.getExternalStorageDirectory().getPath().toString() + "/IMNG";

103.调用浏览器下载

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlStr));

104.xutils下载文件

public void downloadPDF(){
        String url ="http://url.cn/XhlEfM";
        HttpUtils http = new HttpUtils();
        http.download(url, PDFPath, true, true, new RequestCallBack<File>() {

        @Override
            public void onStart() {

            }

             @Override
            public void onLoading(long total, long current, boolean isUploading) {

            }

             @Override
             public void onFailure(HttpException error, String msg) {
                   //tvInfo.setText(msg);
                 Toast.makeText(TopicArticleDetailActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
              }

            @Override
            public void onSuccess(ResponseInfo<File> responseInfo) {
                // TODO Auto-generated method stub
                //responseInfo.result.getPath());
                responseInfo.result.getAbsoluteFile();
                Toast.makeText(TopicArticleDetailActivity.this, "下载完成", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent("android.intent.action.VIEW"); 
                intent.addCategory("android.intent.category.DEFAULT"); 
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
                Uri uri = Uri.fromFile(responseInfo.result.getAbsoluteFile()); 
                // 测试的是图片,到时候用intent.setDataAndType(uri, "application/pdf");代替
                intent.setDataAndType(uri, "image/*"); 
                TopicArticleDetailActivity.this.startActivity(intent);
            }
        });
    }

105.已合并

106.打开WiFi设置:

Intent mIntent = new Intent("/");
ComponentName comp = new ComponentName("com.android.settings","com.android.settings.WirelessSettings");
mIntent.setComponent(comp);
mIntent.setAction("android.intent.action.VIEW");
startActivity(mIntent);

107.查看有无网络以及网络类型:

package com.ics.aop.tool;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class HttpTool {

    /**
     * 判断是否有网络
     * @param context
     * @return
     */
    public static boolean isNetworkConnected(Context context) {  
        if (context != null) {  
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                    .getSystemService(Context.CONNECTIVITY_SERVICE);  
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
            if (mNetworkInfo != null) {
                return mNetworkInfo.isAvailable();  
            }  
        }  
        return false;  
    }

    /**
     * 判断网络是否WiFi
     * @param context
     * @return
     */
    public static boolean isWiFiConnected(Context context) {  
        if (context != null) {  
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                    .getSystemService(Context.CONNECTIVITY_SERVICE);  
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
            if (mNetworkInfo != null) {
                return (mNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI);  
            }  
        }  
        return false;  
    }

    /**
     * 判断网络是否移动网络
     * @param context
     * @return
     */
    public static boolean isMobileConnected(Context context) {  
        if (context != null) {  
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                    .getSystemService(Context.CONNECTIVITY_SERVICE);  
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
            if (mNetworkInfo != null) {
                return (mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE);  
            }  
        }  
        return false;  
    }
}


108.要想在Android Studio使用HttpClient,需要在app的gradle文件中添加
android {
useLibrary ‘org.apache.http.legacy’
}
其实推荐使用HttpURLConnection

109.直接在布局里使用android:background=”白色”和android:background=”normal为白色的selector”效果不一样,使用selector的很白,而直接使用白色的,却有灰度,这应该是手机的bug。
110.// 得到当前view的ViewGroup,可以在已经setContentView了的view的ViewGroup里添加剩余部分

ViewGroup mContent = (ViewGroup) findViewById(BaseView.getResId(mApplication, BaseView.ID, "base_content"));
        mContent.addView(mView);

111.获取每一个文字的宽度(像素)

String ss = "请将一维码或二维码放入框内,即可自动扫描";
        float[] array = new float[ss.length()];
        new Paint().getTextWidths(ss, array);
        //array里面装的就是每一个文字的宽度了

112.APP相关

/**
     * 根据包名启动apk
     *
     * @param packagename
     */
    public static void openAppByPackageName(Context context, String packagename) {
        PackageInfo packageinfo = null;
        try {
            packageinfo = context.getPackageManager().getPackageInfo(packagename, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        if (packageinfo == null) {
            return;
        }
        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        resolveIntent.setPackage(packageinfo.packageName);
        List<ResolveInfo> resolveinfoList = context.getPackageManager()
                .queryIntentActivities(resolveIntent, 0);

        ResolveInfo resolveinfo = resolveinfoList.iterator().next();
        if (resolveinfo != null) {
            String packageName = resolveinfo.activityInfo.packageName;
            String className = resolveinfo.activityInfo.name;
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            ComponentName cn = new ComponentName(packageName, className);
            intent.setComponent(cn);
            // 把数据传递到SDK
            Bundle bundle = new Bundle();
            bundle.putString("uid", ConstantUtil.UID);
            bundle.putString("nickname", ConstantUtil.INFOENTITY.getNickname());
            bundle.putString("head", ConstantUtil.INFOENTITY.getIcon());
            bundle.putString("token", ConstantUtil.TOKEN);
            intent.putExtras(bundle);
            context.startActivity(intent);
        }
    }
DDM-MIMO-FMCW雷达速度模糊与解模糊MATLAB仿真 本文深入解析了DDM-MIMO-FMCW雷达中的速度模糊现象及其解模糊方法,通过MATLAB仿真详细展示了相位编码解调、速度扩展算法和混合波形设计三大解决方案。文章还提供了参数配置、信号建模和结果可视化的实用技巧,并分享了工程实践中的避坑指南,帮助开发者高效解决雷达信号处理中的速度模糊问题。 阅读详情

相关推荐

VMware ESXi 7.0下Intel网卡SR-IOV配置实战:解决虚拟化网络延迟问题

本文详细介绍了在VMware ESXi 7.0环境下为Intel网卡配置SR-IOV(单根I/O虚拟化)的完整实战流程。通过硬件辅助直通技术,虚拟机可直接访问物理网卡资源,有效绕过虚拟化层瓶颈,从而显著降低网络延迟和CPU开销,适用于金融交易、实时计算等对性能敏感的场景。

embedding5hiker的博客 554

Android 获得控件坐标及获取状态栏高度

之前在项目里遇到需要定位控件坐标的问题,这里有两个获取坐标的方法: getLocationInWindow() 得到控件相对窗口左上角的x、y轴坐标。 我理解这个“窗口”应该是不包含状态栏的。 getLocationOnScreen() 得到控件相对屏幕左上角的x、y轴坐标。 我理解这个“屏幕”应该是包含状态栏的。 但是,实际情况这里我log打印得到的

有时丶 2664

一文看懂分布式存储架构

目录一、集中存储结构二、分布式存储1 、分布式存储的兴起2 、分布式存储的重要性3 、分布式存储的种类和比较三、分布式理论浅析1 、一致性和可用性2 、数据分布3 、复制4 、分布式协议5、跨机房部署四、分布式文件系统1、 Google 文件系统( GFS )2、 Taobao 文件系统( TFS )3、 Fackbook Haystack 文件系统4、 CDN 内容分发网络五、分布式键值系统1、 Amazon Dynamo2、 Taobao Tiar3、 ETCD4 、产品选型比较( Etcd , Zoo

weixin_70730532的博客 2万+

Android getDimension()、getDimensionPixelSize()和getDimensionPixelOffset()的详解

最近这一段时间比较忙,都没怎么写博客了,这篇文章主要想介绍几个有关dp、sp和px相互转换的系统api:getDimension()、getDimensionPixelSize()和getDimensionPixelOffset()的区别。 回想起刚学android时,dp转px或sp转px都是用的网上的工具类DensityUtils,如下: /** * dp转px */ public static int dp2px(float dpVal) { .

黄小梁的博客 5050

告别调参玄学:用 DINOv2 (ViT-S/ViT-G) 和 PCA 可视化,直观理解自监督特征

本文深入解析了DINOv2(ViT-S/ViT-G)模型在自监督学习中的特征提取机制,通过PCA降维技术实现特征空间的可视化。文章对比了不同规模模型的特征表达差异,并提供了PCA阈值调优和深度分析的实用技巧,帮助读者直观理解自监督学习的视觉密码。

weixin_42565865的博客 410

地瓜机器人RDK Studio使用入门教程

不知道大家在使用AI开发板的时候有没有遇到过板子官方镜像占据空间大难以保存,想要的时候找不到?官方示例项目久而久之便难以找寻?首次登陆开发板连接网络还需要准备显示器键盘鼠标外设繁杂?…为了解决平时开发过程中遇到的种种不便利问题,地瓜机器人创新的推出了RDK Studio这一官方开发者软件,使智能机器人开发迎来新纪元!通过这一软件极大降低了机器人的开发门槛,哪怕是零基础的用户亦可轻松上手RDK系列板卡!

xiongqi123123的博客 3430

【玩转Android自动化】布局节点速查器

这样我们的元素检测小工具就算全部写完了,以后想看某个页面查看节点信息就可以直接打开我们的APP,开启无障碍服务后,启动悬浮窗,打开指定APP某个页面,点一下悬浮窗就可以在控制台看到美化后的具体的节点信息了。后续如何有需求我们可以把打印的节点信息直接在APP中查看,但是看出节点这种事情还是在PC端大屏上看着才舒服,所以暂时就不展示在手机端喽刀已磨好,接下来就开始在微信中实操吧感兴趣的可以下载demo体验一下,在阅读源码过程遇到任何问题欢迎提Issues,如果对你有帮助,希望动动你的发财小手。

chuyouyinghe的专栏 2380

从零理解Brep:用Python玩转3D建模的边界表示法(附OpenCASCADE示例)

本文深入解析了边界表示法(Brep)在3D建模中的应用,通过Python和OpenCASCADE的实战示例,详细介绍了Brep的核心数据结构、布尔运算、网格转换及3D打印优化技巧。适合CAD设计、3D打印和计算机图形学领域的开发者学习与实践。

n4o5p6q7r的博客 428

Android实用插件——19个开发工具

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34364071的博客 548

Python教程:一文了解Python的深拷贝与浅拷贝

理解 Python 中的深拷贝(deep copy)和浅拷贝(shallow copy)是非常重要的,特别是在处理嵌套结构的数据时。让我们深入探讨这两个概念,并通过代码示例进行说明。

旦莫的博客 3968

uniapp [全端兼容] - 实现上传本地视频到后端服务器及在线预览播放视频+移除视频+进度条上传,将已选视频上传服务端并可预览视频和删除功能,上传单个或多个视频文件及大文件(H5、小程序、app)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp+uview上传视频并预览,UNI-APP视频上传组件,实现视频文件上传视频回显,上传视频并预览、上传多个视频,实现上传视频功能+预览,上传显示视频功能,上传视频预览移除,批量上传视频,上传超大视频文件,视频上传并预览效果,uniapp上传视频,使用uview上传视频及预览,上传视频和删除视频功能,视频流上传播放功能,上传视频到后端,视频上传与实时预览功能,upload上传组件,视频播放器

🏆 前端领域优质创作者 1万+

告别误触和烧屏!这款悬浮窗小工具,才是安卓手机的真正必备

《手机必备工具:屏幕工具箱解决三大痛点》 一款名为"屏幕工具箱"的安卓应用提供了三大实用功能:1)游戏防误触,可自定义屏蔽罩遮挡易误触区域;2)防烧屏保护,自动遮挡OLED屏幕易老化区域;3)全局水印功能,为截图/录屏添加版权标识。该工具无需Root权限,支持按应用个性化设置,适合游戏玩家、短视频用户和内容创作者使用。目前提供夸克和迅雷网盘下载渠道,但需注意版权问题。

青栀的博客 1810

AES-128-CMAC:背景、汽车应用、CAPL 实现与开源工具验证

本文详解车载诊断中AES-128-CMAC算法的原理与应用,涵盖其在UDS安全访问、刷写鉴权、SecOC认证及密钥派生中的核心作用。结合真实汽车电子场景,提供纯CAPL实现代码与测试脚本,并通过pycryptodome进行逐字节验证,确保算法正确性。全程基于CANoe实测数据,可直接用于HIL环境复现,助力开发者高效落地汽车网络安全方案。

蚂蚁小兵 115

android 方法数统计工具,Android小工具

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?Android小工具–方法计数统计DexCount目录结构.├── dex-method-counts.jar├── tools.bat├── app-debug_dexcount.txt**dex-method-counts.jar**获得方法的可执行jar包**tools.bat**tools.bat:获取某一apk...

weixin_32049741的博客 298

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android 常用的方法小工具总结

转自 /**  * 为程序创建桌面快捷方式  */ private void addShortcut(){ Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT")

517

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android常用小工具的使用方法

1. input input text 输入字符串,可以不使用软键盘,更方便调试(包括写脚本测试) input keyevent 输入按键事件,支持全键盘按键,可以在没有输入设备时,操作系统。按键事件可以参考源文件:KeyEvent.java e.g: input keyevent 82  // unlock input keyevent 1     // left

1080

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android7添加小工具,为Android应用添加桌面小工具(App Widget)

这里根据官方参考文档简单介绍为Android应用添加桌面小工具的方法,详情请查阅官方参考文档。(“Widget”中文的意思是“小工具”、“小部件”、“窗口小部件”的意思。)桌面小工具可以让用户直接在桌面上操作应用的部件功能,例如音乐播放器的小工具可以让用户方便地播放或者暂停音乐,又例如最常见的天气时间桌面小工具。越来越多的应用添加了桌面小工具的功能。为应用添加桌面小工具的大概流程1\. 新建一个布...

weixin_42467960的博客 1514

酷!圣诞节首发:给头像加圣诞帽小工具!

最近看到小伙伴问我,马上要到圣诞节了,怎么给微信头像加圣诞帽,其实方法非常的简单,先来看一下我设置好的效果吧!这里面的帽子样式非常多,有10多种样式可以选择,比如红色圣诞帽、绿色圣诞帽等...

程序员吴师兄的博客 540

android AppWidgetProvider开发桌面小工具

什么是桌面小工具  就是你写好代码后 双指缩放桌面屏幕(三星手机出现小组件,华为出现窗口小工具)点击之后会出现你继承AppWidgetProvider所编写的界面 效果: 代码: /** * Implementation of App Widget functionality.做一些自己的操作即可 */ public class NewAppWi

刘国栋的博客 6865

android 开源小工具,Android开发—— 小工具,大效率

一、Hugo插件 —— 打印方法运行时间首先申明下,此Hugo非 彼Hugo(Hugo是由Go语言实现的静态网站生成器)。Hugo插件作用 :能够计算并打印一个方法的输入参数和函数的运行时间Hugo插件应用场景:处理Android 应用卡顿问题(1)先看实例1)在对应方法处标注@DebugLog SearchResultPanel::dispatchResult处标记@DebugLog2)Hugo...

weixin_33544435的博客 302

5音频提示音定时_超越苹果!火爆全网的修改充电提示音安卓也能玩,玩法更多样...

今日推荐:安卓版修改充电提示音适用系统:安卓最近几天iOS 14上的修改充电提示音被玩疯了,小雷也在前几天分享了具体玩法,还没玩上的苹果用户可到小雷的历史文章中搜索充电提示音查看。回到正题,修改充电提示音这种玩法对于安卓这个开放的系统来说从来都不是什么难事,最近就有网友开发了一个小工具,支持一键修改充电提示音,还可以导入自定义音频,今天分享给大家。也得益于安卓的开放性,充电提示音的修改在安卓上实现...

weixin_39739404的博客 113

如何root安卓手机_介绍安卓手机如何加速

今天来聊聊一篇关于安卓手机如何加速的文章,现在就为大家来简单介绍下安卓手机如何加速,希望对各位小伙伴们有所帮助。虽然如今的安卓手机便携设备已经越来越智能,配置和性能也越来越高,但随着使用时间的延长,用户依然会发现自己那台曾经流畅顺滑的机器已经出现了明显的迟缓和卡顿,处理起一些简单的操作也开始变得十分吃力,比如切换应用或者返回主屏幕。下面为大家介绍几条针对Android设备的提速小窍门:方...

weixin_39932458的博客 207

安卓开发之ConstrainLayout辅助UI设计小工具(一)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513120551401.png 先来介绍一下ConstrainLayout的界面 View Option 一个眼球状的工具点击出现如下 下面来分别解释一下所有选项的含义: Show All Constraints:显示所有组件的所有限制 选中和非选择区别主要在,右屏预览屏会显示所有组件的所有限制 而当鼠标选中左屏中某个控件时,左屏的所有组件的限制关系都会显示 未使用Show All Constraints:

m0_52410356的博客 638

手机玩机常识____让安卓机型无root都可以卸载预装应用的小工具

本文介绍了三种卸载安卓预装应用的方法:1)通过系统设置查看应用列表;2)使用ADB命令连接电脑卸载;3)使用免Root第三方工具。重点推荐了一款无需root的卸载工具,需开启ADB调试后扫描应用包名进行卸载,但需注意误删系统应用可能导致系统故障。文中提供了查看应用包名的方法,并强调操作前需确认包名对应关系,以免造成系统问题。文章最后分享了包含卸载工具和包名查看器的下载资源链接。

mg668的博客 2276

android emmc测试软件,鉴别EMMC/UFS如此简单!小工具一键识别闪存

【PConline 应用】最近手机闪存采用EMMC/UFS的话题,引起了很大的关注。同一个型号的手机,使用的竟然是性能、成本都有所差别的闪存,引起了很多消费者的关注。EMMC 5.1闪存相比UFS 2.0、UFS 2.1的性能更弱,但某些手机厂商会在同一型号的手机中混用这三种闪存,而且没有告知消费者。那么如何才能鉴别手机使用的是什么闪存?其实利用一款小工具就可以。这是一款安卓平台上的小工具,名字叫...

weixin_39546501的博客 8246

安卓imei串号修改工具_超越苹果!火爆全网的修改充电提示音安卓也能玩,玩法更多样...

今日推荐:安卓版修改充电提示音适用系统:安卓最近几天iOS 14上的修改充电提示音被玩疯了,小雷也在前几天分享了具体玩法,还没玩上的苹果用户可到小雷的历史文章中搜索充电提示音查看。回到正题,修改充电提示音这种玩法对于安卓这个开放的系统来说从来都不是什么难事,最近就有网友开发了一个小工具,支持一键修改充电提示音,还可以导入自定义音频,今天分享给大家。也得益于安卓的开放性,充电提示音的修改在安卓上实现...

weixin_39593469的博客 939
上一篇: LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
下一篇: 安卓打开浏览器
ithouse
博客等级 码龄12年 200粉丝 212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值