Android应用开发常用知识(3)

根据Intent获取包名

    public static String getAppPackageByIntent(Context context, Intent intent) {
        if (context == null || intent == null) {
            return "";
        }

        String pkgName = "";
        try {
            PackageManager pm = context.getPackageManager();
            ComponentName cn = intent.resolveActivity(pm);
            if (cn != null && pm != null) {
                pkgName = cn.getPackageName();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pkgName;
    }

EditText获取焦点自动选中部分文本

EditText如果想实现获取焦点选中全部文本比较方便,用下面代码即可:

mEditText.setSelectAllOnFocus(true);

如果想部分选中,用下面代码:

        mEditTextCurName.setSelectAllOnFocus(true);
        mEditTextCurName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    int start = 0;
                    int stop = XXXX;
                    mEditText.setSelection(start, stop);
                }
            }
        });

如果只设置setOnFocusChangeListener的话你会发现根本实现不了这个效果,通过看源码发现,在onTouchUp的时候做了某些处理,但如果setSelectAllOnFocus的话会规避这个问题。

Android监听home键消息

可以通过监听action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS广播来实现

取消隐藏键盘时的动画

如果我们的EditText正处于编辑状态,用下面的代码隐藏键盘时会有一个从上到下的动画:

editText.clearFocus();
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);

如果去掉editText.clearFocus()则不会有动画。
http://stackoverflow.com/questions/38417054/hide-android-keyboard-without-animation

AlertDialog实现旋转屏幕不消失

在AndroidManifest activity中加入下面设置

android:configChanges="keyboardHidden|orientation|screenSize"

Space控件

Space是Android 4.0中新增的一个控件,它可以用来分隔不同的控件,其中形成一个空白的区域。

EditText 取消复制粘贴功能

    mEditText.setCustomSelectionActionModeCallback(new NoAction());

    public static class NoAction implements ActionMode.Callback {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
        }
    }

引用support库版本问题

项目中有时候会同时引用com.android.support:appcompat-v7和com.android.support:support-v13,这时候要保持版本的一致,否则可能会出现报错

RelativeLayout 内容居中解决办法

使用Linearlayout本来利用父控件的gravity属性是很好解决的。但是对应RelativeLayout虽然有 gravity属性,但是如果你使用,你会发现实际他是不能生效的。
解决办法:
在RelativeLayout的子空间里,使用以下3个属性就行了。

android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"

gravity 一般是针对linearlayout会使用很方便。

分享

    public static void share(Activity activity, String title, String url){
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_TEXT, activity.getString(R.string.share_page, title, url, getAppName()));
        activity.startActivity(Intent.createChooser(intent, activity.getString(R.string.text_share)));
    }
    <string name="share_page">「%1$s」:%2$1s (来自 @%3$sApp) </string>
    <string name="text_share">分享</string>

获取应用名称,应用版本

    public static String getAppName(){
        if(sAppName == null){
            PackageManager packageManager = null;
            ApplicationInfo applicationInfo = null;
            try {
                packageManager = mAppContext.getPackageManager();
                applicationInfo = packageManager.getApplicationInfo(mAppContext.getPackageName(), 0);
            } catch (PackageManager.NameNotFoundException e) {
                applicationInfo = null;
            }
            sAppName = (String) packageManager.getApplicationLabel(applicationInfo);
        }
        return sAppName;
    }

    public static String getVersionName(){
        if(sVerionName == null){
            PackageManager packageManager = mAppContext.getPackageManager();
            PackageInfo packageInfo = null;
            try {
                packageInfo = packageManager.getPackageInfo(mAppContext.getPackageName(), 0);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            if(packageInfo != null){
                sVerionName = packageInfo.versionName;
            }
        }
        return sVerionName;
    }

Resources类中的getIdentifier(name, defType, defPackage)方法

根据资源名称获取其ID,比如我们想获取status bar高度,就可以采取下面的方法:

    Resources resources = mActivity.getResources();
    int resourceId = resources.getIdentifier("status_bar_height", "dimen","android");
    int height = resources.getDimensionPixelSize(resourceId);

TextView字体大小不随系统设置里面字体大小改变

通过TextView代码我们发现public void setTextSize(int unit, float size)里面是通过

    public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

来计算字体大小的,设置里面的字体大小改变的是metrics.scaledDensity,那么我们调用

setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
setTextSize(TypedValue.COMPLEX_UNIT_PT, textSize)
setTextSize(TypedValue.COMPLEX_UNIT_IN, textSize)
setTextSize(TypedValue.COMPLEX_UNIT_MM, textSize)
setTextSize(float size)  //sp

或者

android:textSize="16dp"
android:textSize="16px"

等等,不用sp就可以了;

view.getHeight()=0的解决办法

原因是可能该View还没有进行measure,可以用下面的方法解决这个问题:

int height = view.getHeight();
if (height == 0) {
    int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
    int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
    view.measure(w, h);
    height = view.getMeasuredHeight();
}

或者

        getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mHeight = getMeasuredHeight();
                mWidth = getMeasuredWidth();
            }
        });

或者,一般是在oncreate()方法中会遇到这个问题,那么可以用 onPostResume()方法中调用获取view宽高的方法。因为onPostResume是指onResume彻底执行完毕的回调,所以这时候去获取就可以了。

Intent.FLAG_ACTIVITY_NEW_TASK的使用

我们可能有这样的使用场景:应用调起其他应用的界面时,比如文件选择器,当我们此时home键回到桌面,再从桌面点击应用回来,还想停留在文件选择器界面时,就不要设置intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);,让两个acitvity在相同的task里面。

ImageView的android:stretchMode属性

stretchMode属性值的作用是设置GridView中的条目以什么缩放模式去填充剩余空间。参数stretchMode 可选值为:
- none
- columnWidth
- spacingWidth
- spacingWidthUniform

在AndroidManifest中动态引用 applicationId

在 build.gradle 中配置:

android {
    defaultConfig {
        applicationId "com.android.hq.example"
        ...
    }
}

AndroidManifest.xml 中使用:

<intent-filter>
    <action android:name="${applicationId}.action.TEST" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寒江蓑笠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值