Androidの最も基本的な知識(継続的な更新)

9247 ワード

ネット上の開発者の小さな知識を抜粋し、開発者として知らなければならない.
跳ね上がったキーボードでレイアウトが押し出されないようにする
Androidの開発ではキーボードを開くときにレイアウトファイルを押し出すことがよくありますが、このようなアプリケーションは100%=アンインストール率と推定されていますが、この問題を解決するにはandroidManiFestだけが必要です.xmlファイル対応ノードにandroid:windowSoftInputMode="adjustPan"を追加すればOK
公式説明:Adjustment option for softInputMode:set to have a window pan when an input method is shown,so it doesn't need to deal with resizing but just panned by the framework to ensure the current input focus is visible.(入力方式が表示されている場合、サイズの調整は処理されません).
また、InputMethodManagerを使用してキーボードを動的に表示または非表示にすることもできます.
        InputMethodManager imm = getSystemService(Context.INPUT_METHOD_SERVICE);
        // imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
        if (imm.isActive())  //   true
            imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
                    InputMethodManager.HIDE_NOT_ALWAYS);

5.リソースを取得するuri
Resources res = getResources() ;
int resId = R.drawable.ic_launcher ;
Uri icUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE 
+ "://"
+ res.getResourcePackageName(resId)
+ "/"
+ res.getResourceTypeName(resId)
+ "/"
+ res.getResourceEntryName(resId)) ;

6.Intentが解析されるか確認する
		Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:110")) ;
		ComponentName name = intent.resolveActivity(getPackageManager()) ;
		if(name == null) {
			//  Intent     
		} else {
			//Intent     ,    startActivity()      
		}

UriとUrlEncoder
先日Androidの開発で一例に遭遇したとき、URLのスペース文字(ASCIIコードは0 x 20)はjava.net.URLEncoderクラスencode以降は、%20ではなく+番号になり、serverが正しく認識できなくなります.
調べたところ、URLEncodeには2つの方法があります.
 
public static String encode (String s,String charsetName)
Encodes s using the Charset named bycharsetName.
 
public static String encode (String s)
Equivalent to encode(s, "UTF-8").

 
第2の方法はすでにAndroid API 1から廃棄されており、第1の方法で表示される指定文字セットはUTF-8であり、この符号化は%20ではなくスペース記号を+に符号化することを提案している.もちろん、これはURL仕様に合致しています.RFC-1738を参照してください.
 
スペース記号を%20に符号化するには、別のencode、すなわちandroidを使用します.net.RFC−2396規格を用いたUriクラス.構文は次のとおりです.
public static String encode (String s)
Encodes characters in the given string as'%'-escaped octets using the UTF-8 scheme. Leaves letters ("A-Z","a-z"), numbers ("0-9"), and unreserved characters("_-!.~'()*") intact. Encodes all other characters.
 
ネットワーク関連インタフェースの実装を行う場合は、具体的な違いを真剣に理解するとともに、オープンプラットフォームのドキュメントでプロトコルの約束をできるだけ明確に記述し、開発とデバッグに困難をもたらさないようにすることをお勧めします.ちょうどこの問題を発見しなかったら、どのくらいのテストを経てこのバグを発見することができますか?
EditTextのカーソル色の変更
EditTextには、カーソルの色を制御するためのプロパティがあります.android:textCursorDrawable
Android:textCursorDrawable="@null","@null"作用はカーソルの色をtextcolorと同じにするPS:textcursordrawable frameworkのtextviewにこれがカーソルを表しています.点9ピクチャです.このピクチャを交換すればいいです.このピクチャはframework/core/res/res/values/themesです.xmlで交換します.アプリケーション層にandroid:textCursorDrawable="@drawable/ic_png"を再editTextで設定するもカーソルを交換することができる.
 
onCreateメソッドでのコンポーネントのサイズの取得
		final ImageView imgView = (ImageView) findViewById(R.id.img);

		/**       */
		ViewTreeObserver vto2 = imgView.getViewTreeObserver();
		vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			@Override
			public void onGlobalLayout() {

				imgView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

				System.out.println("width:" + imgView.getWidth() + ",height:" + imgView.getHeight());
			}
		});

		/**       */
		ViewTreeObserver vto = imgView.getViewTreeObserver();
		vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
			@Override
			public boolean onPreDraw() {
				imgView.getViewTreeObserver().removeOnPreDrawListener(this);
				System.out.println("width*:" + imgView.getWidth() + ",height*:" + imgView.getHeight());
				return true;
			}
		});

 
入力が中国語または英語かどうかを判断する
    /**
     *       
     *
     * @param c
     * @return
     */
    public static boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
            return true;
        }
        return false;
    }

    /**
     *   String      
     *
     * @param name
     * @return
     */
    public static boolean checkNameChese(String name) {
        boolean res = true;
        char[] cTemp = name.toCharArray();
        for (int i = 0; i < name.length(); i++) {
            if (!isChinese(cTemp[i])) {
                res = false;
                break;
            }
        }
        return res;
    }

    public static boolean strIsEnglish(String word) {
        //  boolean sign = true; //        'true'
        for (int i = 0; i < word.length(); i++) {
            if (String.valueOf(word.charAt(i)).equals(" "))
                return true;
            if (!(word.charAt(i) >= 'A' && word.charAt(i) <= 'Z')
                    && !(word.charAt(i) >= 'a' && word.charAt(i) <= 'z')) {
                return false;
            }
        }
        return true;
    }

Ping ip
 public String Ping(String str) {  
        String resault = "";  
            Process p;  
            try {  
                //ping -c 3 -w 100     ,-c   ping    3  ping 3  ,-w 100             ,       100    
                p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + str);  
                int status = p.waitFor();  
  
                InputStream input = p.getInputStream();  
                BufferedReader in = new BufferedReader(new InputStreamReader(input));  
                StringBuffer buffer = new StringBuffer();  
                String line = "";  
                while ((line = in.readLine()) != null){  
                  buffer.append(line);  
                }  
                System.out.println("Return ============" + buffer.toString());  
  
                if (status == 0) {  
                    resault = "success";  
                } else {  
                    resault = "faild";  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
              
  
        return resault;  
    }  

タイトルバーとナビゲーションバーの間に黒い線の問題が発生
true
@null

viewクリック範囲拡大
注意:親レイアウトは1つのviewのTouchDelegateしか設定できません.設定を繰り返すと最後の1つだけ有効になります.
 public static void expandViewTouchDelegate(final View view, final int top,  
            final int bottom, final int left, final int right) {  
  
        ((View) view.getParent()).post(new Runnable() {  
            @Override  
            public void run() {  
                Rect bounds = new Rect();  
                view.setEnabled(true);  
                view.getHitRect(bounds);  
  
                bounds.top -= top;  
                bounds.bottom += bottom;  
                bounds.left -= left;  
                bounds.right += right;  
  
                TouchDelegate touchDelegate = new TouchDelegate(bounds, view);  
  
                if (View.class.isInstance(view.getParent())) {  
                    ((View) view.getParent()).setTouchDelegate(touchDelegate);  
                }  
            }  
        });  
    }

appを開く
Intent intent = getPackageManager().getLaunchIntentForPackage("com.tencent.mm");
if (intent != null) {
    startActivity(intent);
} else {
    //      
    Toast.makeText(getApplicationContext(), " ,        APP ", Toast.LENGTH_LONG).show();
}

インタフェースがScrollViewの場合、インタフェースを開くと自動的に最後までスクロールする解決方法
開発中にこのような問題に遭遇しました.インタフェースの最外層はScrollViewで、その中にはListViewと他の焦点を得ることができるViewがネストされています.それからインタフェースを開くたびに自動的に最下部にスクロールして、振り回されて、簡単な方法を発見しました.
ScrollViewの上位レベルの任意のviewを取得し、次のメソッドを呼び出します.
view.setFocusable(true); view.setFocusableInTouchMode(true); view.requestFocus();
startActivity ForResult要注意
転送または受信が必要なすべてのActivityはsingleInstanceの設定を許可しないか、標準モードに設定するしかありません.そうしないと、startActivity ForResult()後にActivityに直接戻ります.RESULT_CANCELED.singleTopもだめだという文章もありますが、私はテスト中に正常に動作することができます.singleTaskでは、起動されたActivityに設定することはできません.
 
requestCodeは0より大きいはずです
 
小数を1桁保持
BigDecimal decimal = new BigDecimal(String.valueOf(v));
DecimalFormat format = new DecimalFormat("####.#");
format.setRoundingMode(RoundingMode.HALF_UP);
return Double.parseDouble(format.format(decimal.doubleValue()));