Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android小知識庫

Android小知識庫

編輯:關於Android編程

The APK file does not exist on disk.Error while Installing APK

解決方案:
\

Android Studio獲取SHA1

1、全局配置jdk1.8.0_45\bin(或cd進入bin目錄)
2、keytool -v -list -keystore 你的keystore路徑
3、輸入秘鑰庫口令:如果沒設置,這裡就是空,直接回車就進去了。

Genymotion下載虛擬鏡像Connection timeout

Add new device出現的問題:

Failed to deploy virtual device.
Unable to create virtual device.Connection timeout occurred.

解決方案:

當選擇Google Nexus 5 - 6.0.0 - API 23 - 1080x1920下載device失敗後,到C:\Users\用戶主目錄\AppData\Local\Genymobile\Genymotion\ova下看到genymotion_vbox86p_6.0_160114_090449.ova,大小卻是0KB,在C:\Users\用戶主目錄\AppData\Local\Genymobile\genymotion.log,打開該文件,找到類似“http://files2.genymotion.com/dists/6.0.0/ova/genymotion_vbox86p_6.0_160114_090449.ova”路徑,即您想要下載的鏡像文件URL;用迅雷去下載,下載完成後放到C:\Users\用戶主目錄\AppData\Local\Genymobile\Genymotion\ova;重新點擊Google Nexus 5 - 6.0.0 - API 23 - 1080x1920去下載,驗證安裝後即會顯示在設備列表中。

Android Studio 如何Debug

單擊F5(Step Over),單行一個個方法執行
單擊F6(Step Into),單行執行
單擊F7(Step Out),不往下執行,回到上一行
單擊F8(Resume Program),跳出當前斷點

Android Studio設置默認的簽名文件

新浪微博SSO登錄,微信分享這些都需要簽名打包,才能看到效果,設置默認簽名文件為自己的簽名jks,這樣就不需要打包了。
在app目錄下添加你的.jks,然後app的build.gradle文件中的增加以下內容:
第一種:

android {  
    signingConfigs {  
        debug {  
            storeFile file("你的.jks")
            storePassword 'android'
            keyAlias 'android'
            keyPassword 'android'
        }          
    }  	
}

 

第二種:

android {  
    signingConfigs {  
        release {  
            storeFile file("你的.jks")
            storePassword 'android'
            keyAlias 'android'
            keyPassword 'android'
        }          
    }  
	buildTypes {
        debug {
            signingConfig signingConfigs.release
        }        
    }
}

 

這樣編譯出來的debug版本直接用的是你的正式簽名

Fragment懶加載

protected boolean isVisible;

   @Override
   public void setUserVisibleHint(boolean isVisibleToUser) {
       super.setUserVisibleHint(isVisibleToUser);
       if (getUserVisibleHint()) {
           isVisible = true;
           onVisible();
       } else {
           isVisible = false;
           onInvisible();
       }
   }

   protected void onVisible() {
      lazyLoad();
   }

   protected void lazyLoad() {
       if (!isVisible) {
           return;
       }
       getData();
   }

   protected void onInvisible() {
   }

Android studio頭注釋和方法注釋

File | Settings | Editor|File and Code Templates|Includes|File Header

/**
 * Created by ${USER} on ${DATE}.
 */

 

輸入我們想要設置的注釋模板

adapter.getPositionForSelection()和getSectionForPosition()

getPositionForSection()根據分類列的索引號獲得該序列的首個位置
getSectionForPosition()通過該項的位置,獲得所在分類組的索引號

getResources().getColor(R.color.color_name) is deprecated和drawableTop

textView.setTextColor(Color.parseColor("#FFFFFF"));
//或者
ContextCompat.getColor(context, R.color.color_name)

showPopupWindow

private void showPopupMenu(View v) {
    final View bgView = View.inflate(DemoApplication.getContext(), R.layout.demo_popup_window_bg, null);
    bgView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            hidePopupWindow();
        }
    });
    if (mPopupBackground == null) {
        mPopupBackground = new PopupWindow(bgView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }
    mPopupBackground.showAtLocation(v, Gravity.BOTTOM, 0, 0);
}

v:父布局
demo_popup_window_bg.xml





 

onFinishInflate()

view的onFinishInflate()何時調用的?
當View中所有的子控件均被映射成xml後觸發;
MyView mv = (MyView)View.inflate (context,R.layout.my_view,null);
當加載完成xml後,就會執行那個方法;
我們一般使用View的流程是在onCreate中使用setContentView來設置要顯示Layout文件或直接創建一個View,在當設置了ContentView之後系統會對這個View進行解析,然後回調當前視圖View中的onFinishInflate方法。只有解析了這個View我們才能在這個View容器中獲取到擁有Id的組件,同樣因為系統解析完View之後才會調用onFinishInflate方法,所以我們自定義組件時可以onFinishInflate方法中獲取指定子View的引用。

Fragment設置隱藏或顯示某個Fragment

MainFragment點擊

public void onItemClick(AdapterView adapterView, View view,
                            int position, long id) {
       
        ((MainActivity) getActivity()).showImageFragment(true, mData.get(position).get("title").toString(), mData.get(position).get("imgUrl").toString());
        
    }

 

MainActivity

public void showImageFragment(boolean show, String imgTxt, String imgUrl) {
        // showActionbarWithTabs(!show);
        if (show) {
            getSupportFragmentManager().beginTransaction()
                    .show(imageDetailFragment).commit();
            imageDetailFragment.setImgData(imgTxt, imgUrl);
        } else {
            getSupportFragmentManager().beginTransaction()
                    .hide(imageDetailFragment).commit();
        }

    }

 

獲取arrt的值

不同主題下需要把顏色,數值寫成attr屬性
xml裡,我們可以簡單的引用attr屬性值

android:background="?attr/colorPrimary"

 

代碼獲取

TypedValue typedValue = new TypedValue();
mContext.getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true);
int colorPrimary = typedValue.data;//value.data裡面存儲著的就是獲取到的colorPrimary的值

 

撥號盤撥打電話

Intent intent = new Intent(Intent.ACTION_CALL,
Uri.parse("tel:" + "400-036-1977"));
// intent.setAction(Intent.ACTION_CALL);// 直接撥號
intent.setAction(Intent.ACTION_DIAL);// 撥號盤
startActivity(intent);

Drawable /Bitmap、String/InputStream、Bitmap/byte[]互轉

http://wuxiaolong.me/2015/08/10/Drawable-to-Bitmap/

ProgressDialog

final ProgressDialog progress = new ProgressDialog(LoginActivity.this);
		progress.setMessage("請稍等...");
		progress.setCanceledOnTouchOutside(false);
		progress.show();
progress.dismiss();

毫秒

毫秒Calendar.getInstance().getTimeInMillis()和System.currentTimeMillis()

Fragment setUserVisibleHint(boolean isVisibleToUser)

@Override
   public void setUserVisibleHint(boolean isVisibleToUser) {
       super.setUserVisibleHint(isVisibleToUser);
       if (isVisibleToUser) {
           //相當於Fragment的onResume
       } else {
           //相當於Fragment的onPause
       }
   }

Fragment onActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		getActivity();
		if (resultCode == Activity.RESULT_OK
				&& requestCode == AppUtils.REQUEST_CODE_ISLOGIN) {
			// 檢查是否完善資料

			if (AppUtils.getSharedPreferences(getActivity()).getBoolean(
					"hasPersonalData", false)) {
				// 取本地存取是否完善資料,完善直接提示咨詢對話框
				consultationDialog();
			} else {
				getCheckPersonalData();
			}

		}
	} 

startActivityForResult(intent,
							AppConfig.REQUEST_CODE_DIALOGUE);// 不是調用 getActivity().startActivityForResult()。

dimen代碼取值

getDimension方法獲取到資源文件中定義的dimension值。

Resources res = getResources();
float fontSize = res.getDimension(R.dimen.font_size);

 

數組初始化賦值

1、創建數組後,通過循環對數組賦值。
例如代碼:
int [] nums = new int [100];
for(int i=0;i<10;i++){
nums[i] = i;
}
2、例如代碼:
int [] nums = {0,1,2,3,4,5,6,7,8,9};
3、int [] nums = new int[]{0,1,2,3,4,5,6,7,8,9};

Fragment.isAdded()

Fragment mBeforeFragment = new Fragment();
public void switchFragment(Fragment currentFragment) {
if (currentFragment.isAdded()) {
getSupportFragmentManager().beginTransaction().hide(mBeforeFragment).show(currentFragment).commit();
} else {
getSupportFragmentManager().beginTransaction().hide(mBeforeFragment).add(R.id.container, currentFragment).commit();
}
mBeforeFragment = currentFragment;
}

調用:

switchFragment(HomeFragment.newInstance());

 

HomeFragment

public static HomeFragment homeFragment = null;

public static HomeFragment newInstance() {
if (homeFragment == null) {
homeFragment = new HomeFragment();
}
return homeFragment;
}

 

android之inputType屬性


//文本類型,多為大寫、小寫和數字符號。
    android:inputType="none"
    android:inputType="text"
    android:inputType="textCapCharacters" 字母大寫
    android:inputType="textCapWords" 首字母大寫
    android:inputType="textCapSentences" 僅第一個字母大寫
    android:inputType="textAutoCorrect" 自動完成
    android:inputType="textAutoComplete" 自動完成
    android:inputType="textMultiLine" 多行輸入
    android:inputType="textImeMultiLine" 輸入法多行(如果支持)
    android:inputType="textNoSuggestions" 不提示
    android:inputType="textUri" 網址
    android:inputType="textEmailAddress" 電子郵件地址
    android:inputType="textEmailSubject" 郵件主題
    android:inputType="textShortMessage" 短訊
    android:inputType="textLongMessage" 長信息
    android:inputType="textPersonName" 人名
    android:inputType="textPostalAddress" 地址
    android:inputType="textPassword" 密碼
    android:inputType="textVisiblePassword" 可見密碼
    android:inputType="textWebEditText" 作為網頁表單的文本
    android:inputType="textFilter" 文本篩選過濾
    android:inputType="textPhonetic" 拼音輸入
//數值類型
    android:inputType="number" 數字
    android:inputType="numberSigned" 帶符號數字格式
    android:inputType="numberDecimal" 帶小數點的浮點格式
    android:inputType="phone" 撥號鍵盤
    android:inputType="datetime" 時間日期
    android:inputType="date" 日期鍵盤
android:inputType="time" 時間鍵盤

ImageView.ScaleType

(1)ImageView.ScaleType.center:圖片位於視圖中間,但不執行縮放。
(2)ImageView.ScaleType.CENTER_CROP 按統一比例縮放圖片(保持圖片的尺寸比例)便於圖片的兩維(寬度和高度)等於或者大於相應的視圖的維度
(3)ImageView.ScaleType.CENTER_INSIDE按統一比例縮放圖片(保持圖片的尺寸比例)便於圖片的兩維(寬度和高度)等於或者小於相應的視圖的維度
(4)ImageView.ScaleType.FIT_CENTER縮放圖片使用center
(5)ImageView.ScaleType.FIT_END縮放圖片使用END
(6)ImageView.ScaleType.FIT_START縮放圖片使用START
(7)ImageView.ScaleType.FIT_XY縮放圖片使用XY
(8)ImageView.ScaleType.MATRIX當繪制時使用圖片矩陣縮放

調用系統發送短信界面

/**
* 發送短信
* @param smsBody
*/
private void sendSMS(String smsBody)
{
//Uri smsToUri = Uri.parse("smsto:10000"); //如果想指定發送人
Uri smsToUri = Uri.parse("smsto:");
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra("sms_body", smsBody);
startActivity(intent);
}

跳轉市場搜索某款軟件

Intent intent = new Intent(
				"android.intent.action.VIEW");
		intent.setData(Uri
				.parse("market://details?id=com.adobe.flashplayer"));
		startActivity(intent);

檢測系統中是否安裝某款軟件

//檢測系統中是否已經安裝了adobe flash player插件,插件的packageName是com.adobe.flashplayer:
private boolean check() {
		PackageManager pm = getPackageManager();
		List infoList = pm
				.getInstalledPackages(PackageManager.GET_SERVICES);
		for (PackageInfo info : infoList) {
			if ("com.adobe.flashplayer".equals(info.packageName)) {
				return true;
			}
		}
		return false;
}

private void isAvilible(String packageName) {

		PackageInfo packageInfo;
		try {
			packageInfo = this.getPackageManager().getPackageInfo(packageName,
					0);

		} catch (NameNotFoundException e) {
			packageInfo = null;
			e.printStackTrace();
		}
		if (packageInfo != null) {
//1、通過包名
			Intent intent = new Intent();
			intent = getPackageManager().getLaunchIntentForPackage(packageName);
			startActivity(intent);
//2、通過類名: 
Intent intent=new Intent();  
intent.setComponent(new ComponentName(packageName, "com.joe.internet.Main"));  
startActivity(intent);  
		} 

	}

對話框菜單

new AlertDialog.Builder(this)
						.setTitle("choice")
						.setItems(new String[] { "選擇1", "選擇2", "選擇3", "選擇4" },
								new DialogInterface.OnClickListener() {

									@Override
									public void onClick(DialogInterface dialog,
											int which) {
										Toast.makeText(MyContentActivity.this,
												which + "", Toast.LENGTH_SHORT)
												.show();

									}
								}).show();

定義ProgressBar


progress_rotate:



    
        
    

 

幻燈片效果

xml


 

style


 

anim




    
    
    
    
    


 

MD5加密

public String Md5(String plainText) {
		String result = "";
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(plainText.getBytes());
			byte b[] = md.digest();

			int i;

			StringBuffer buf = new StringBuffer("");
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			result = buf.toString().toUpperCase();// 32位的加密(轉成大寫)

			buf.toString().substring(8, 24);// 16位的加密

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return result;
	}

設置自動跳轉頁面

Timer

Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Intent goIntent = new Intent();
				goIntent.setClass(LauncherActivity.this, DemoActivity.class);
				startActivity(goIntent);
			}
		}, 3 * 1000);
	}

Handler

new Handler().postDelayed(new Runnable() {
			@Override
			public void run() {
				startActivity(new Intent(SplashScreen.this,
						DomobSampleActivity.class));
				finish();
			}
		}, 1000);

隨機取數

List list = new ArrayList();
		for (int i = 0; i < 10; i++) {
			list.add(i);
		}
		Collections.shuffle(list);
		for (int v : list) {
			Log.d("wxl", "V===" + v);
		}

或:

Random random = new Random();
int ran = random.nextInt(keywordsList.size());
			String tmp = keywordsList.get(ran).get("keyword").toString();

 

selector下的屬性值

android:state_pressed
如果是true,當被點擊時顯示該圖片,如果是false沒被按下時顯示默認。
android:state_focused
true,獲得焦點時顯示;false,沒獲得焦點顯示默認。
android:state_selected
true,當被選擇時顯示該圖片;false,當未被選擇時顯示該圖片。
android:state_checkable
true,當 能使用時顯示該圖片;false,當CheckBox不能使用時顯示該圖片。
android:state_checked
true,當CheckBox選中時顯示該圖片;false,當CheckBox為選中時顯示該圖片。
android:state_enabled
true,當該組件能使用時顯示該圖片;false,當該組件不能使用時顯示該圖片。
android:state_window_focused
true,當此activity獲得焦點在最前面時顯示該圖片;false,當沒在最前面時顯示該圖片。



    
    
    

 

帶下劃線的EditText

public class LinedEditText extends EditText {
	private Paint linePaint;
	private float margin;
	private int paperColor;

	public LinedEditText(Context paramContext, AttributeSet paramAttributeSet) {
		super(paramContext, paramAttributeSet);
		this.linePaint = new Paint();
	}
	@Override
	protected void onDraw(Canvas paramCanvas) {
		paramCanvas.drawColor(this.paperColor);
		int i = getLineCount();// 得到總的行數
		int j = getHeight();// 獲得TextView的高度
		int k = getLineHeight();// 獲得TextView的行高
		int m = j / k + 1;// 總的線數
		if (i < m)
			i = m;
		int n = getCompoundPaddingTop();
		Log.d("wxl", "n----" + n);
		paramCanvas.drawLine(0.0F, n, getRight(), n, this.linePaint);
		for (int i2 = 0;; i2++) {
			if (i2 >= i) {
				setPadding(10 + (int) this.margin, 0, 0, 0);
				super.onDraw(paramCanvas);
				paramCanvas.restore();
				return;
			}
			n += k;
			paramCanvas.drawLine(0.0F, n, getRight(), n, this.linePaint);
			paramCanvas.save();
		}
	}
}

主要工作就是重載onDraw方法,利用從TextView繼承下來的getLineCount函數獲取文本所占的行數,以及getLineBounds來獲取特定行的基准高度值,而且這個函數第二個參數會返回此行的“外包裝”值。再利用這些值繪制這一行的線條。為了讓界面的View使用自定義的EditText類,必須在配置文件中進行設置

關閉鍵盤

public static void hideSoftInput(Activity activity) {
        if (activity.getCurrentFocus() != null)
            ((InputMethodManager) activity
                    .getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(activity.getCurrentFocus()
                            .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }

界面不被彈出的鍵盤蓋住

一進入activity就彈出鍵盤

android:windowSoftInputMode="adjustResize" 
android:windowSoftInputMode="adjustPan|stateAlwaysVisible"

 

第一個軟鍵盤和輸入框會完全分離,而第二個輸入框還是會被軟鍵盤蓋住一點點
而且第二個要把兩個屬性疊加起來,為什麼要疊加起來呢,因為如果只用adjustPan 的話需要點擊輸入框才會彈出軟鍵盤

在 AndroidMainfest.xml中選擇哪個activity,設置windowSoftInputMode屬性為

adjustUnspecified|stateHidden
android:windowSoftInputMode="adjustUnspecified|stateHidden"

 

windowSoftInputMode各值的含義:

stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設置

stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裡的狀態,無論是隱藏還是顯示

stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏

stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的

stateVisible:軟鍵盤通常是可見的

stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態

adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示

adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間

adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分

控件美化Shape

http://wuxiaolong.me/2013/07/09/shape/

獲取版本名稱 VersionName

public String getVersionName(Context context) {
		PackageManager manager = context.getPackageManager();
		String packageName = context.getPackageName();
		try {
			PackageInfo info = manager.getPackageInfo(packageName, 0);
			return info.versionName;
		} catch (NameNotFoundException e) {
			return "1.0";
		}
	}

獲取Android手機設備的IMSI / IMEI 信息

TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String imsi = mTelephonyMgr.getSubscriberId(); 
String imei = mTelephonyMgr.getDeviceId(); 
Log.i("wxl", "imsi="+imsi);為null
Log.i("wxl", "imei="+imei); 
另外不要忘了在AndroidManifest.xml中加上讀取手機狀態的權限

自定義Log是否顯示

public class Log {
       private static final String TAG = "wxl";
       private static final boolean LOG = true;
       public static void i(String msg) {
           if (LOG)
               android.util.Log.i(TAG , msg);
       }
       public static void d(String msg) {
           if (LOG)
               android.util.Log.d(TAG , msg);
       }
       public static void w(String msg) {
           if (LOG)
               android.util.Log.w(TAG , msg);
       }
       public static void w(String msg, Throwable throwable) {
           if (LOG)
               android.util.Log.w(TAG , msg, throwable);
       }
       public static void v(String msg) {
           if (LOG)
               android.util.Log.v(TAG , msg);
       }
       public static void e(String msg) {
           android.util.Log.e(TAG , msg);
       }
       public static void e(String msg, Throwable throwable) {
           android.util.Log.e(TAG , msg, throwable);
       }
   }

異步操作AsyncTask

參數1:向後台任務的執行方法傳遞參數的類型 ; 
參數2:在後台任務執行過程中,要求主UI線程處理中間狀態,通常是一些UI處理中傳遞的參數類型;
參數3:後台任務執行完返回時的參數類型。
 private class MyAsyncTask extends AsyncTask {

		// 實現抽象方法doInBackground(),代碼將在後台線程中執行,由execute()觸發
		protected Void doInBackground(Integer... params) {
			return null;
		}

		// 任務啟動,可以在這裡顯示一個對話框,這裡簡單處理
		protected void onPreExecute() {
			super.onPreExecute();
		}

		// 取消
		protected void onCancelled() {
			super.onCancelled();
		}

		// 定義後台進程執行完後的處理
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
			Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT).show();
		}

		// 更新進度,在UI主線程執行的內容,將item加入list中。方法中的參數為范式方式,實質為數組,由於我們只傳遞了item一個String,要獲取,為values[0]
		protected void onProgressUpdate(String... values) {
			super.onProgressUpdate(values);
		}

	}

調用:

1
new MyAsyncTask().execute(參數1);// 創建後台任務的對象

 

檢查網絡狀態

public boolean checkNetworkInfo() {
		ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		// mobile 3G Data Network
		State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
				.getState();
		// wifi
		State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
				.getState();
		// 如果3G網絡和wifi網絡都未連接,且不是處於正在連接狀態 則進入Network Setting界面 由用戶配置網絡連接
		if (mobile == State.CONNECTED || mobile == State.CONNECTING)
			return true;
		if (wifi == State.CONNECTED || wifi == State.CONNECTING)
			return true;
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(getResources().getString(R.string.no_network))
				.setCancelable(false)
				.setPositiveButton(
						getResources().getString(R.string.configuration),
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {

								// 進入無線網絡配置界面
								startActivity(new Intent(
										Settings.ACTION_WIRELESS_SETTINGS));
								MainActivity.this.finish();
							}
						})
				.setNegativeButton(getResources().getString(R.string.quit),
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								MainActivity.this.finish();
							}
						});
		builder.show();
		return false;
	}

代碼判斷調用:

// 檢查網絡狀態
		if (!checkNetworkInfo()) {
			return;
		}

 

Html.fromHtml()

讓數據接受網頁的格式

URLEncoder.encode(String s); 網址請求中文解析
…代表省略號

 

URLEncoder.encode

網址請求帶中文

 
URLEncoder.encode(content, "utf-8")

 

Android中字體加粗

  • 在xml文件中使用
 
android:textStyle=”bold”
  • Java 代碼

(網上查XML不能將中文設置成粗體,只能通過Java code。Android 2.2 可以通過XML將中文設置成粗體)

 
TextView tv = (TextView)findViewById(R.id.TextView01); 
TextPaint tp = tv.getPaint();
tp.setFakeBoldText(true);
  • Html.fromHtml(“\<\b>”)
 
(1)viewHolder.title.setText(Html.fromHtml(""
				+ listTitle.get(position).get("title") + ""));
(2)TextView.setText(Html.fromHtml("hello"));

代碼設置背景圖setImageResource/setBackgroundResource


textView.setBackgroundResource(R.drawable.bg_menu_1);設置背景圖片
textView.setBackgroundColor(0xffffffff);
setImageResource與xml中的src的屬性才是相匹配的,而setBackgroundResource是與xml中的background屬性相匹配
的
holder.chat_sound_iv_right.setBackgroundResource(0);//沒有圖片

android中的ellipsize


用法如下:
在xml中
android:ellipsize = "end"    省略號在結尾
android:ellipsize = "start"   省略號在開頭
android:ellipsize = "middle"     省略號在中間
android:ellipsize = "marquee"  跑馬燈
最好加一個約束android:singleline = "true"
跑馬燈
android:singleLine="true"
android:ellipsize="marquee"
android:focusableInTouchMode="true"
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine=true 表示使用單行文字,多行文字也就無所謂使用Marquee效果了。
android:marqueeRepeatLimit,設置走馬燈滾動的次數。
android:ellipsize,設置了文字過長時如何切斷文字,可以有none, start,middle, end, 如果使用走馬燈效果則設為marquee.
android:focusable,Android的缺省行為是在控件獲得Focus時才會顯示走馬燈效果

控件點擊效果



    
    
    

保留小數點

方法一:


private DecimalFormat df;
df = new DecimalFormat("0.0");
float data;
df.format(data);//返回值

 

方法二:


double juli = 1569;
String result = String.format("%.1f", juli/1000);

 

RadioGroup




       

       
   

android:button=”@null” 去除RadioButton前面的圓點
android:background=”@drawable/radio” 使用定義的樣式

占位符%s替換

%d (表示整數)
%f (表示浮點數)
%s (表示字符串)
txt.setText(String.format (“被替換%1$s”,”替換內容”));

TextView中嵌套圖片Drawable


Drawable drawable = getResources().getDrawable(R.drawable.ji_dot_nor);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
textView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);  
說明:setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom)
意思是設置Drawable顯示在text的左、上、右、下位置。(Textview、Button都可以)

TextView做成分割線

SpannableString單擊文字鏈接


SpannableString spannableString = new SpannableString(str);
		spannableString.setSpan(new ClickableSpan() {
			public void onClick(View view) {
				// Intent intent = new Intent(ApkTest.this, Apk.class);
				Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
						+ "15261589767"));
				startActivity(intent);
			}
		}, 0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		TextView.setText(spannableString);
		TextView.setMovementMethod(LinkMovementMethod.getInstance());

TextView中文字通過SpannableString

來設置超鏈接、顏色、字體等屬性


String  title =”123456”;
SpannableString titleStr = new SpannableString(title);
titleStr.setSpan(new ForegroundColorSpan(Color.RED), 0,
						titleStr.length(), 0);
textView.setText(titleStr);

 

android:drawableTop屬性

寫在TextView裡,實現圖片+文字

獲取分辨率


DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

displayMetrics.widthPixels + "x"
				+ displayMetrics.heightPixels;

代碼完成控件

Button


linearLayout = (LinearLayout) findViewById(R.id.linearLayout2);
LayoutParams layoutParams = new LinearLayout.LayoutParams(0,
				LinearLayout.LayoutParams.WRAP_CONTENT, 1);//1均分屬性
layoutParams.setMargins(10, 10, 10, 10);

Button button = new Button(MainActivity.this);
button.setLayoutParams(layoutParams);
linearLayout.addView(button);

 

TextView


private TextView overlay;
private void initOverlay() {
		LayoutInflater inflater = LayoutInflater.from(this);
		overlay = (TextView) inflater.inflate(R.layout.overlay, null);
		overlay.setVisibility(View.INVISIBLE);
		WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.TYPE_APPLICATION,
				WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
						| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
				PixelFormat.TRANSLUCENT);
		WindowManager windowManager = (WindowManager) this
				.getSystemService(Context.WINDOW_SERVICE);
		windowManager.addView(overlay, lp);
	}




private LinearLayout.LayoutParams layoutParams = null;
		private LinearLayout.LayoutParams btnParmas;

layoutParams = new LinearLayout.LayoutParams(
							LinearLayout.LayoutParams.WRAP_CONTENT,
							LinearLayout.LayoutParams.WRAP_CONTENT);
					layoutParams.setMargins(
							(int) getResources().getDimension(
									R.dimen.lable_left), 0, 0, 0);
					btnParmas = new LinearLayout.LayoutParams(
							LinearLayout.LayoutParams.WRAP_CONTENT,
							(int) getResources().getDimension(
									R.dimen.lable_height));

					for (int i = 0; i < lables.length; i++) {
						LinearLayout linearLayout = new LinearLayout(activity);
						lableColor = random.nextInt(lableColors.length);
						Button lable = new Button(activity);
						lable.setText(lables[i]);
						lable.setGravity(Gravity.CENTER_HORIZONTAL
								| Gravity.CENTER_VERTICAL);
						lable.setTextSize(getResources().getDimension(
								R.dimen.lable));
						lable.setTextColor(getResources().getColor(
								R.color.white));
						lable.setBackgroundResource(lableColors[i]);
						linearLayout.addView(lable, btnParmas);
						holder.play_lables.addView(linearLayout, layoutParams);
					}

 

TextWatcher


editText1.addTextChangedListener(watcher);
TextWatcher watcher = new TextWatcher() {
		public void onTextChanged(CharSequence arg0, int arg1, int arg2,
				int arg3) {
		}
		public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
				int arg3) {
		}
		public void afterTextChanged(Editable arg0) {			
		}
	};

屏幕旋轉時不銷毀


AndroidManifest加入
android:configChanges="orientation|keyboardHidden"

獲取屏幕方向


Configuration newConfig = getResources().getConfiguration();    
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){    
            //橫屏    
         }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){    
            //豎屏    
         }else if(newConfig.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_NO){    
            //鍵盤沒關閉。屏幕方向為橫屏    
         }else if(newConfig.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_YES){    
            //鍵盤關閉。屏幕方向為豎屏    
         }

 

List增加數據

簡單


private List getData() {
		List data = new ArrayList();
		data.add("123");
		data.add("345");
		data.add("456");
		data.add("567");
		return data;
	}

鍵值對


private List> getData() {
        List> list = new ArrayList>();
 
        Map map = new HashMap();
        map.put("title", "G1");
        map.put("info", "google 1");
        map.put("img", R.drawable.i1);
        list.add(map);
 
        map = new HashMap();
        map.put("title", "G2");
        map.put("info", "google 2");
        map.put("img", R.drawable.i2);
        list.add(map);
 
        map = new HashMap();
        map.put("title", "G3");
        map.put("info", "google 3");
        map.put("img", R.drawable.i3);
        list.add(map);
         
        return list;
    }

清除數據:


data.clear();
listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1,getData()));

 

LinkedList


LinkedList list = new LinkedList();
list.addFirst("000");

驗證是否手機號碼


public boolean isMobileNO(String mobiles) {
		String expression = "((^(13|15|18)[0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))";
		Pattern pattern = Pattern.compile(expression);
		Matcher matcher = pattern.matcher(mobiles);
		Log.d("wxl", matcher.matches() + "");
		return matcher.matches();
	}

正則表達式數字驗證


public boolean isNumber(String str)
    {
        java.util.regex.Pattern pattern=java.util.regex.Pattern.compile("[0-9]*");
        java.util.regex.Matcher match=pattern.matcher(str);
        if(match.matches()==false)
        {
             return false;
        }
        else
        {
             return true;
        }
    }

SharedPreferences

SharedPreferences存數據


SharedPreferences sharedPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//獲取編輯器
editor.putString("name", "張三");
editor.putInt("age", 24);
editor.putBoolean("AutoLogin", false);

editor.commit();//提交修改

SharedPreferences取數據


SharedPreferences sharedPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);
//getString()第二個參數為缺省值,如果preference中不存在該key,將返回缺省值
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);
boolean autoLogin= sharedPreferences. getBoolean("AutoLogin", false);

Intent 傳值

簡單傳值

ActivityPage


Intent intent = new Intent(ActivityPage.this, Player.class);
			//保存信息
			Bundle mBundle = new Bundle();
			mBundle.putString("realname ", realname);
			intent.putExtras(mBundle);

 

Player接受


realname = this.getIntent().getStringExtra("realname");
Intent intent = new Intent();
intent.setClass(HomeActivity.this, CompanyActivity.class);
intent.putExtra("mCompanySupply", mCompanySupply);
				startActivity(intent);
CompanyActivity.class:
ArrayList  mCompanySupply = (ArrayList) getIntent()
				.getSerializableExtra("mCompanySupply");

 

復雜傳值

A頁面:


private static final int REQUEST_CODE_A = 0;
private static final int RESULT_CODE_B = 0;
Intent intent = new Intent();
				Bundle bundle = new Bundle();
				intent.setClass(MainActivity.this, TestBActivity.class);
				bundle.putString("msg", textView.getText().toString());
				intent.putExtras(bundle);
				startActivityForResult(intent, REQUEST_CODE_A);

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == REQUEST_CODE_A && resultCode == RESULT_OK) {
			String str=data.getExtras().getString("result");
		}
	}

 

B頁面


private static final int RESULT_CODE_B = 0;
Intent intent = new Intent();
				intent.putExtra("result", textView.getText().toString());
				setResult(RESULT_OK, intent);
				finish();

public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			Intent intent = new Intent();
			intent.putExtra("result", "直接返回");
			setResult(RESULT_OK, intent);
			this.finish();
			return true;
		} else {
			return super.onKeyDown(keyCode, event);
		}
	}

 

List


Intent intent = new Intent();
					intent.putStringArrayListExtra("mSelectedPhotos",
							mSelectedPhotos);
					setResult(RESULT_OK, intent);
					
					
					ArrayList mSelectedPhotos = (ArrayList) intent
						.getStringArrayListExtra("mSelectedPhotos");

xml文件中導入另一個xml文件的方法include

單擊返回鍵兩次退出


private static Boolean isExit = false;
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                        if (isExit == false) {
                                isExit = true;
                                Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
                                new Timer().schedule(new TimerTask() {
                                        @Override
                                        public void run() {
                                                isExit = false;
                                        }
                                }, 2000);
                        } else {
                                finish();
                                System.exit(0);
                        }
                }
                return false;
        }

或者


@Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
        if (keyCode == KeyEvent.KEYCODE_BACK) { 
            long secondTime = System.currentTimeMillis(); 
            if (secondTime - firstTime > 800) {//如果兩次按鍵時間間隔大於800毫秒,則不退出 
                Toast.makeText(MainActivity.this, "再按一次退出程序...", 
                        Toast.LENGTH_SHORT).show(); 
                firstTime = secondTime;//更新firstTime 
                return true; 
            } else { 
                System.exit(0);//否則退出程序 
            } 
        } 
        return super.onKeyUp(keyCode, event); 
    }

 

圖片左右循環移動


TranslateAnimation left, right;
right = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -1f,
				Animation.RELATIVE_TO_PARENT, -2f,
				Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT,
				0f);
		left = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -2f,
				Animation.RELATIVE_TO_PARENT, -1f,
				Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT,
				0f);
		right.setDuration(25000);
		left.setDuration(25000);
		right.setFillAfter(true);
		left.setFillAfter(true);

		right.setAnimationListener(new Animation.AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
			}

			@Override
			public void onAnimationEnd(Animation animation) {
				runImage.startAnimation(left);
			}
		});
		left.setAnimationListener(new Animation.AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
			}

			@Override
			public void onAnimationEnd(Animation animation) {
				runImage.startAnimation(right);
			}
		});
		runImage.startAnimation(right);

控件左右抖動

res下anim
animlayout.xml




 

cycle_7.xml



 

(2)java代碼

Animation shake = AnimationUtils.loadAnimation(
						MainActivity.this, R.anim.animlayout);
				btn.setAnimation(shake);

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved