Android开发小问题tips---持续更新中~

来源:互联网 发布:数据库镜像 数据库备份 编辑:程序博客网 时间:2024/04/28 01:13
(1) 给AVD安装apk?
     主要解决API4.0以上版本google输入法bug,需要给AVD安装搜狗输入法。
     打开需要安装的AVD, 将搜狗输入法apk放入SDK/tools文件夹中, 命令cmd---> XXX..../SDK/tools adb install sougoushurufa.apk

(2) AutoCompleteTextView提示字符

    该控件默认输入两个字符以上才会出现提示,在xml中定义该控件中添加 android:completionThreshold="1" 即可定义输入一个字符就显示提示

(3) 与Android无关~~Calender类使用

    Calendar calendar=Calendar.getInstance(Locale.CHINA);

    int Month=calendar.get(Calendar.MONTH);

    此时要注意,Calendar类拿到的Month是从0开始计算的,所以真正的月份要+1

(4) Menu
    //每次点击menu键触发
    @Override
    public boolean onPrepareOptionsMenu(Menu menu){
        showSearchWindow();
        return true;
    }

  注意!!这个时候如果返回的是true,会导致点击menu键出现延迟的显现,要点击很多下才会有效果,所以这时候应该return false!!

(5)如何在app中引用外部下载的项目/将一个已经存在的项目作为一个Library?

导入项目后,右键properties-->Android--> is Library选线打钩

在你的app中就可以在library中添加这个项目了

(6)使用AlertDialog的小Demo

Builder alertBuilder=new AlertDialog.Builder(this);AlertDialog alertDialog=alertBuilder.create();final EditText inputText=(EditText)alertDialog.findViewById(R.id.search_remark_edittext);alertBuilder.setTitle(dialogTitle).setView(getLayoutInflater().inflate(R.layout.search_remark_dialog,null)).setPositiveButton(dialogConfirmButton, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubString remarkString=inputText.getText().toString();SearchRemark(remarkString);}}).setNegativeButton(dialogCancelButton, null).show();

(7) 给一个relativelayout添加layout_alignParentBottom:

            RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);            params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);            buttomLayout.setLayoutParams(params);


(8) 代码添加layout_above:

RelativeLayout.Layoutparams params = (RelativeLayout.LayoutParams)button.getLayoutParams();params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);button.setLayoutParams(params); 

(9) 用代码给一个view添加一个click

XX.performClick();

(10)初始化EditText的时候阻止系统自动弹出的软键盘///////打开软件盘在(14)

在manifest.xml文件里,找到相应的activity在里面的<activity>中添加下面两行代码即可

  1.            android:windowSoftInputMode="adjustUnspecified|stateHidden"  
  2.             android:configChanges="orientation|keyboardHidden"

(11) 给EditText的输入监听

        searchRemarkEditText.addTextChangedListener(new TextWatcher() {
            
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub
                System.out.println("!!!!!!!!!!          "+s);
                searchRemark(s.toString());
            }
            
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                
            }
        });


(12) 卸载app时系统报错:数据包为有效的设备管理器

解决方法:重启设备再次删除


(13)android:hint属性

在EditText中使用android:hint的标签,当切换语言种类的时候,hint内容并不改变。

例如,android:hint="@string/mark_hint"

初始化的语言环境是En,则切换到中文状态的时候,依然是“Hint”

因为切换功能是用一个新的activity实现的,所以切换语言完毕之后该activity处在onResume方法中,所以直接在onResume()方法里面设置edit.setHint(getResource.getString(R.string.mark_hint))即可


(14)打开软键盘/////////关闭软键盘在(10)

  1.                      InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);  
  2.                      imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 
注意,getSystemService方法要在activity中才可以,如果你的代码写在一个View的子类中,可以在前面使用getContext().

(15) 设置EditText光标位置

editText.setSelection(index);//int index


(16) 关于ListFragment的问题

按照android官方文档上的例子,尝试写了一个Shakespeare的小demo,但是竖屏的时候初始化总是出现TitlesFragment cannot cast to app.Fragment的错误

实在想不通,记录一下,其实真心不需要使用listFragment那么烦,还要设定系统版本在3.0以上才可以使用,直接使用ListView即可


(17) 使用fragment的注意事项

使用fragment时,初始化fragment的activity要继承FragmentActivity而非Activity,否则会报cannot be cast to andrpod.app.Fragment错误~


(18)官网的Fragment例子有问题

在写官网demo例子的时候要注意,当切换竖屏时,点击listfragment的item会开启一个新的activity,但是这个activity依然使用到了fragment,所以记住,只要使用了fragment的activity,都要继承FragmentActivity


并且在使用的时候要注意android.support.v4.Fragment和android.app.Fragment的区别,导包的时候注意到support.v4的包,尽量不要用app的包,因为app只支持11以上,且eclipse会各种报错,添加很多注释


并且在这个FragmentActivity中,使用的FragmentTransaction总是报错,说不能讲support.v4.FragmentTransaction转换成app.FragmentTransaction,修正方法为:

                FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();
                fragmentTransaction.add(android.R.id.content,details).commit();

注意调用方法并不是getFragmentManager()!!!!!


(19)      ImageView代码设置

//设置背景和大小参数

        imageView.setImageResource(ROLES_IMAGE[getShownIndex()]);
        imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));


(20)解决两个activity切换时的黑屏问题

其实是第二个activity启动时UI阻塞,而activity背景色为黑色,所以先加载黑色的背景

此时将第二个activity背景色设置为透明即可,方法有两种:

<1> 如果app中没有复杂布局,直接在manifest.xml中设置activity的theme即可

            android:theme="@android:style/Theme.Translucent"

<2> 如果需要实现app的自定义style,则稍微复杂

首先在style中自定义activity的theme

    <style name="Transparent" parent="android:Theme.Light">
        <item name="android:windowIsTranslucent">true</item>
    </style>

还有别的item自己定义,例如

        <item name="actionBarStyle">@style/ActionBar</item>
        <item name="android:actionBarStyle">@style/ActionBar</item>

其次在manifest中设置activity:theme为自定义的Transparent即可


(21)软键盘布局管理

在Activity中设置:android:windowSoftInputMode="stateUnspecified",                                        

"stateUnchanged", 软键盘被保持上次的状态。 
"stateHidden", 当用户选择该Activity时,软键盘被隐藏。                        
 "stateAlwaysHidden", 软键盘总是被隐藏的。 
"stateVisible",. 软键盘是可见的。                                        
"stateAlwaysVisible", 当用户选择这个Activity时,软键盘是可见的。 
"adjustResize", (压缩模式) 当软键盘弹出时,要对主窗口调整屏幕的大小以便留出软键盘的空间。 
"adjustPan" (平移模式:当输入框不会被遮挡时,该模式没有对布局进行调整,然而当输入框将要被遮挡时, 窗口就会进行平移。也就是说,该模式始终是保持输入框为可见。(键盘遮挡使用这种方法就能解决了!)

(22) dialog 的设置

dialog中如果不注意设置          dialog.setCanceledOnTouchOutside(false);

会出现dialog失去焦点时取消事件,如果设置了,那么只能通过dialog的按钮对dialog进行确定和取消操作


(23)在android中发送http请求一定不在主线程中发送,要使用AsyncTask等发送!

(24) 适用cmd命令打开mysql:  记住是!! mysql -uroot -p

(25)取消app的统一menu

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_show_scanner_guide);
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);


注意第一句是取消app的统一设置的menu,第二句是当前activity的初始化,第三句是完全全屏,连显示时间的最上面一条通知栏也去掉


(26) 颜色的透明度在xml文件中的设置

如果不想在代码中设置而是在xml文件中直接定义颜色的透明度,则颜色的值不是原来的6位而是8位,前两位就是该颜色的透明度

例如,#7D2286f2 这个颜色是透明度为125的蓝色,7D就是透明度,后面6位才是正常的RGB值


(27) 使用SharedPreferences记录某个activity是否第一次激活

1. 首先创建方法 isFirstClick()判断是否第一次点击

        private boolean isFirstClick(){
        SharedPreferences sp = getSharedPreferences(Constants.GET_SCANNER_KEY, Context.MODE_PRIVATE);
        boolean firstclick = sp.getBoolean(Constants.GET_SHAREDPREF_SCANNER_KEY, true);
        return firstclick;
    }
   

2. 点击之后将该值设置为false

    private void setClickFalse(){
        SharedPreferences sp = getSharedPreferences(Constants.GET_SCANNER_KEY, Context.MODE_PRIVATE);
        Editor spEditor = sp.edit();
        spEditor.putBoolean(Constants.GET_SHAREDPREF_SCANNER_KEY, false);
        spEditor.commit();
    }

3.使用

   首先使用isFirstClick判断是否为true,如果为真,则是第一次进入该activity,可进行相应的操作。

  操作完毕之后,调用setClickFalse方法将其设置为false,此后每次进入该activity检查isFirstClick时,返回值都是false


(28) 不同设备的SD卡地址获取

网上找到的command的方法对于samsung的4.4.2的Note 3 完全无用

最后发现其SD card的地址如下:

/mnt/extSdCard

其余的设备的SD card用下面的方法获取应该OK

    public static String getExterPath()
    {
       String sdcardPath = null;
       String devStoragePath = null;
       String tempPath = null;

       boolean checkExternalStorage=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
       if (checkExternalStorage) {
           devStoragePath = Environment.getExternalStorageDirectory().toString();
       }
       String info = getSystemPathInfo();
       if (info != null && !"".equals(info)) {
           String[] infos = info.split("\n");
        for (String path : infos) {
            if (path.contains("*") && path.toLowerCase().contains("sdcard")) {
               tempPath = path.substring(1,path.length());
                  if (!tempPath.equals(devStoragePath)) {
                        sdcardPath = tempPath;
                  }
              }
        }  
       }
       
       return sdcardPath;


(29) 获取设备机型,系统型号

        String model= android.os.Build.MODEL;
        String version =android.os.Build.VERSION.SDK;
        String release = android.os.Build.VERSION.RELEASE;

(30) 获取设备名称

    public  static String getDeviceName() {
      String manufacturer = Build.MANUFACTURER;
      String model = Build.MODEL;
      
      LogCat.d("MANUFACTURER = " + Build.MANUFACTURER);
      LogCat.d("MODEL = " + Build.MODEL);
      LogCat.d("BRAND = " + Build.BRAND);
      LogCat.d("PRODUCT = " + Build.PRODUCT);
      LogCat.d("DEVICE = " + Build.DEVICE);
      
      if (model.startsWith(manufacturer)) {
        return capitalize(model);
      } else {
        return capitalize(manufacturer) + " " + model;
      }
    }


(31) 有时候出现,有时候又不出现的问题

最近在做一个PDF的项目,一个功能有时候有用,有时候没用;也没有报错;

这个时候可以思考的方向是线程阻塞了,Thread A没有执行完,Thread B调用它,此时肯定拿到的值不是处理完之后的值

所以将调用者稍微阻塞一下即可


(32)使用table后,textview使用wrap_content定义高度,但是长度后第二行部分显示不完全

这时候使用textview的一个行间距离属性定义即可


(33) 使用google map API 注意事项

    1. 在google console中申请该项目使用google map的API。具体的,只要是跟MAP有关系的API都打开就好了

    2. 测试的设备上一定要安装 有google play services

    3. 确定使用的debug.keystore是你用来申请google map API的那个,否则地图不显示


(34)        相机镜头旋转90度方法

setDisplayOrientation(90);即可


(35) 判断设备是否为pad

    private boolean isPad() {  
        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  
        Display display = wm.getDefaultDisplay();  
        // 屏幕宽度  
        float screenWidth = display.getWidth();  
        // 屏幕高度  
        float screenHeight = display.getHeight();  
        DisplayMetrics dm = new DisplayMetrics();  
        display.getMetrics(dm);  
        double x = Math.pow(dm.widthPixels / dm.xdpi, 2);  
        double y = Math.pow(dm.heightPixels / dm.ydpi, 2);  
        // 屏幕尺寸  
        double screenInches = Math.sqrt(x + y);  
        // 大于6尺寸则为Pad  
        if (screenInches >= 6.0) {  
            return true;  
        }  
        return false;  
    } 

(36)        运行项目时碰到Error:Installation error: INSTALL_FAILED_VERSION_DOWNGRADE

其实也不知道为什么,貌似是项目安装在设备上的版本号比代码中的版本号要高,这时候只要将项目的版本号改大即可

像这样~

    android:versionCode="219"
    android:versionName="2.1.9"

(37)               textView 换行

设置                     android:singleLine="false" 即可


(38)             获取本机电话号码/IMSI

    public String getIMSI() {String myIMSI = null;try {TelephonyManager telephonyManager = ((TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE));//myIMSI = telephonyManager.getSubscriberId(); IMSImyIMSI=telephonyManager.getLine1Number();} catch (Exception e) {}return myIMSI;
(39)             添加第三方library总是失败

下面提到的两点都要注意,首先library要和项目放在同一个workspace里面,导入是一定记得选择将导入项目拷贝到workspace中。

其次,如果项目的API为19,那么引用的第三方包的Android API为20则一定导入失败,修改第三方包的Android API至少等于现在开发项目的API,或更低版本。

搞定之后Clean,再不行就关掉Eclipse再重新打开,有时候Eclipse重建项目会有滞后。


(41)          报错如下

Unable to execute dex: Multiple dex files define Lorg/apache/commons/collections/Buffer;

原因是项目使用了 commons-beanutils-1.8.3.jar 和 commons-collections-3.2.jar两个jar包,而这个两个包里面包含了相同的org.apache.common这个包,将beanutils里面的common包删了,保存,重新打开workspace载入即可


(42)          将编辑的照片存入手机成功,但在相册中不显示

这个问题很坑,想要见到照片的话重启即可

但不能每次为了查看照片都重启手机

于是用下面的广播可以解决问题

  //Refresh the photo environment, sometimes the latest photos will not shown                     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));                  









0 0