工作近三年,也积累了不少东西,我有一个自己的小知识库,它记录我实际开发中遇到的问题及一些小知识点,一直未分享,今天这里分享出来。
目录
- 125、getTag()
- 124、让某个Activity透明
- 123、将String写入txt格式存存储卡
- 122、Android Home键监听
- 121、ProgressDialog
- 120、ListView点击item标示消失
- 119、拨号盘拨打电话
- 118、毫秒
- 117、Drawable/Bitmap、String/InputStream、Bitmap/byte[]互转
- 116、应用WebView加载html和本地图片资源
- 115、android 代码设置drawableleft
- 114、Json解析
125、GetTag()
publicvoid onClick(View v) {
((Button)v).getText().toString();
v.getTag().toString()
}
124、让某个Activity透明
res/values文件夹下建立styles.xml:
<?xml version=“1.0″ encoding=“utf-8″?>
<RESOURCES>
<STYLE name=“translucent”>
<item name=“android:windowBackground”>@color/translucent_background</item>
<item name=“android:windowIsTranslucent”>true</item>
<item name=“android:windowAnimationStyle”>@android:style/Animation.Translucent</item>
</STYLE>
</RESOURCES>
在该文件夹下在创建文件colors.xml
<?xml version=“1.0″ encoding=“UTF-8″?>
<RESOURCES>
<COLOR name=“translucent_background”>#60000000</COLOR>
</RESOURCES>
AndroidManifest.xml中找到要弹出的activity,加入theme: android:theme=”@style/translucent”
现在activity透明,但是里面的button不透明.如果让他们也透明或者半透明,就设置窗口属性.
Window window=getWindow();
WindowManager.LayoutParams wl = window.getAttributes();
wl.flags=WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
wl.alpha=0.6f; //这句就是设置窗口里崆件的透明度的.0.0全透明.1.0不透明.
window.setAttributes(wl);
123、将String写入Txt格式存存储卡
<!-- sd卡 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
/**
* 将String写入存储卡
*
* @param person
* @throws FileNotFoundException
*/
privatevoid writeJSONObjectToSdCard(String person) {
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "json" + File.separator + "json.txt");
// 文件夹不存在的话,就创建文件夹
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
// 写入内存卡
PrintStream outputStream = null;
try {
outputStream = new PrintStream(new FileOutputStream(file));
outputStream.print(person.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
122、Android Home键监听
/**
* Home键监听封装
*
* @author way
*
*/
public class HomeWatcher {
static final String TAG = "wxl";
private Context mContext;
private IntentFilter mFilter;
private OnHomePressedListener mListener;
private InnerRecevier mRecevier;
// 回调接口
public interface OnHomePressedListener {
public void onHomePressed();
public void onHomeLongPressed();
}
public HomeWatcher(Context context) {
mContext = context;
mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
}
/**
* 设置监听
*
* @param listener
*/
public void setOnHomePressedListener(OnHomePressedListener listener) {
mListener = listener;
mRecevier = new InnerRecevier();
}
/**
* 开始监听,注册广播
*/
public void startWatch() {
if (mRecevier != null) {
mContext.registerReceiver(mRecevier, mFilter);
}
}
/**
* 停止监听,注销广播
*/
public void stopWatch() {
if (mRecevier != null) {
mContext.unregisterReceiver(mRecevier);
}
}
/**
* 广播接收者
*/
class InnerRecevier extends BroadcastReceiver {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null) {
Log.e(TAG, "action:" + action + ",reason:" + reason);
if (mListener != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
// 短按home键
mListener.onHomePressed();
} else if (reason
.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
// 长按home键
mListener.onHomeLongPressed();
}
}
}
}
}
}
}
调用:
class MainActivity extends Activity {
private ListView listView;
int mPosition = 0;
ArrayAdapter arrayAdapter;
List<String> dataList;
private static final String TAG = "wxl";
private HomeWatcher mHomeWatcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
@Override
public void onHomePressed() {
Log.e(TAG, "onHomePressed");
}
@Override
public void onHomeLongPressed() {
Log.e(TAG, "onHomeLongPressed");
}
});
mHomeWatcher.startWatch();
}
/**
* 重新进入或打开屏幕灯
*/
protected void onRestart() {
Log.d("wxl", "onRestart");
mHomeWatcher.startWatch();
super.onRestart();
}
/**
* 按Home键或关闭屏幕灯
*/
protected void onPause() {
super.onPause();
Log.d("wxl", "onPause");
mHomeWatcher.stopWatch();// 在onPause中停止监听,不然会报错的。
}
private List<String> getData() {
// Log.d("wxl", "getData=" + "getData");
List<String> data = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
data.add("测试数据" + i);
}
return data;
}
}
121、ProgressDialog
final ProgressDialog progress = new ProgressDialog(LoginActivity.this);
progress.setMessage("请稍等...");
progress.setCanceledOnTouchOutside(false);
progress.show();
progress.dismiss();
120、ListView点击Item标示消失
-
DataAdapter ```java Intent intent = new Intent(activity, ChatActivity.class); intent.putExtra("userhead", doctorList.get(position) .getHeadImg()); intent.putExtra("username", doctorList.get(position) .getName()); intent.putExtra("userId", doctorList.get(position) .getUserinfo_djid()); intent.putExtra("position", position); startActivityForResult(intent,
AppConfig.REQUEST_CODE_DIALOGUE);
-
ChatActivity.class
public void onBackPressed() {
Intent intent;
intent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt("position", position);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
}
- onActivityResult
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == AppConfig.REQUEST_CODE_DIALOGUE
&& resultCode == RESULT_OK) {
int position = data.getExtras().getInt("position");
Object object = dataAdapter.getItem(position);
if (object instanceof DoctorList) {
DoctorList doctorList = (DoctorList) object;
doctorList.setUnreadnum("0");
dataAdapter.notifyDataSetChanged();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
- DoctorList
class DialogueBean {
private String result;
private ArrayList<DoctorList> doctorList;
public class DoctorList implements Serializable {
private String userinfo_djid;
private String headImg;
private String name;
private String unreadnum;
private String infoContent;
private String sendDate;
private String ky_flag;
private String tobewritten;
}
}
119、拨号盘拨打电话
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);
118、毫秒
毫秒Calendar.getInstance().getTimeInMillis()和System.currentTimeMillis()
117、Drawable/Bitmap、String/InputStream、Bitmap/Byte[]互转
(1)Drawable互转Bitmap
Drawable转Bitmap
Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
BitmapDrawable bd = (BitmapDrawable) d;
Bitmap bm = bd.getBitmap();
Bitmap转Drawable
Bitmap bm=xxx; //xxx根据你的情况获取
BitmapDrawable bd=BitmapDrawable(bm);
BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
mPicPath//本地图片路径转成Bitmap格式
Bitmap pic = BitmapFactory.decodeFile(this.mPicPath);
image.setImageBitmap(pic);
转成Bitmap格式
(2)String与InputStream相互转换
String to InputStream
String str = "String与InputStream相互转换";
InputStream in_nocode = new ByteArrayInputStream(str.getBytes());
InputStream in_withcode = new ByteArrayInputStream(str.getBytes("UTF-8"));
InputStream to String
这里提供几个方法。
方法1:
public String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "/n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
方法2:
public String inputStream2String (InputStream in) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
return out.toString();
}
方法3:
public static String inputStream2String(InputStream is) throws IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i=-1;
while((i=is.read())!=-1){
baos.write(i);
}
return baos.toString();
}
Drawable → Bitmap
Drawable → Bitmap
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
2、从资源中获取Bitmap
Resources res=getResources();
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
Bitmap → byte[]
3、Bitmap → byte[]
private byte[] Bitmap2Bytes(Bitmap bm){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray(); }
4、 byte[] → Bitmap
private Bitmap Bytes2Bimap(byte[] b){
if(b.length!=0){
return BitmapFactory.decodeByteArray(b, 0, b.length);
}
else {
return null;
}
}
116、应用WebView加载Html和本地图片资源
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
下边是实现这个功能的源代码:
public void loadHTML() {
final String mimeType = "text/html";
final String encoding = "utf-8";
final String html = "<h1>Header</h1><p>Custom HTML</p>
<p><img src=\"file:///android_asset/image1.jpg\" />
</p>";
WebView wv = (WebView) findViewById(R.id.wv1);
wv.loadDataWithBaseURL("fake://not/needed", html,
mimeType, encoding, "");
}
//wView.loadUrl("file:///android_asset/index.html");
-----打开本包内asset目录下的index.html文件
//wView.loadUrl("content://com.android.htmlfileprovider/sdcard/index.html");
-----打开本地sd卡内的index.html文件
//wView.loadUrl("http://wap.baidu.com");
-----打开指定URL的html文件 ......
webView.setInitialScale(30); //这个就是重点,你可以在这里根据需求来设置缩放比例
<activity
android:name="com.xiaomolong.ufosay.ui.SearchResultActvity"
android:hardwareAccelerated="true"
android:label="@string/search_result"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
if (searchView == null) {
Log.e("wxl", "Fail to get Search View.");
return true;
}
searchView.setIconifiedByDefault(true); // 缺省值就是true,可能不专门进行设置,false和true的效果图如下,true的输入框更大
// 获取搜索服务管理器
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
// searchable activity的component name,由此系统可通过intent进行唤起
ComponentName cn = new ComponentName(this, SearchResultActvity.class);
// 通过搜索管理器,从searchable
// activity中获取相关搜索信息,就是searchable的xml设置。如果返回null,表示该activity不存在,或者不是searchable
SearchableInfo info = searchManager.getSearchableInfo(cn);
if (info == null) {
Log.e("wxl", "Fail to get search info.");
}
// 将searchable activity的搜索信息与search view关联
searchView.setSearchableInfo(info);
return true;
}
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/search_hint"
android:label="@string/search_result" />
<!-- wei:必须包含android:label,一般与app或activity的label相同,但不一样也不影响效果 -->
<!-- wei:一般建议提供hint,作为输入框的提示 -->
<item
android:id="@+id/action_search"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/ic_action_search"
android:showAsAction="ifRoom|withText"
android:title="action_websearch"/>
public class SearchResultActvity extends Activity {
private WebView mWebview;
private String searchResult = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_result);
// … …
doSearchQuery(getIntent());
initView();
}
@Override
protected void onNewIntent(Intent intent) { // activity重新置顶
super.onNewIntent(intent);
doSearchQuery(intent);
}
// 对searchable activity的调用仍是标准的intent,我们可以从intent中获取信息,即要搜索的内容
private void doSearchQuery(Intent intent) {
if (intent == null)
return;
String queryAction = intent.getAction();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) { // 如果是通过ACTION_SEARCH来调用,即如果通过搜索调用
searchResult = intent.getStringExtra(SearchManager.QUERY); // 获取搜索内容
// … …
}
}
private void initView() {
mWebview = (WebView) findViewById(R.id.mWebview);
WebSettings webSettings = mWebview.getSettings();
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setPluginState(PluginState.ON);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
mWebview.setDownloadListener(new MyWebViewDownLoadListener());
mWebview.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
mWebview.setWebChromeClient(new WebChromeClient());
// Log.d("wxl", "url=" + setUrl());
mWebview.loadUrl(setUrl());
mWebview.setWebViewClient(new MyWebViewClient());
}
public void onPause() {// 继承自Activity
super.onPause();
mWebview.onPause();
}
public void onResume() {// 继承自Activity
super.onResume();
mWebview.onResume();
}
private String setUrl() {
String url = "";
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("http://www.soku.com/m/y/video?q=");
try {
stringBuffer.append(URLEncoder.encode(searchResult, "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
url = stringBuffer.toString();
return url;
}
// 文件的下载
private class MyWebViewDownLoadListener implements DownloadListener {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype, long contentLength) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
class MyWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
mWebview.setVisibility(View.GONE);
Log.i("wxl", "onReceivedError");
// Toast.makeText(SearchResultActvity.this, "网络不给力",
// Toast.LENGTH_LONG)
// .show();
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.i("wxl", "onPageStarted url=" + url);
// Toast.makeText(SearchResultActvity.this, "onPageStartedurl=" +
// url,
// Toast.LENGTH_LONG).show();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// view.loadUrl(url);
Log.i("wxl", "shouldOverrideUrlLoading url=" + url);
// Toast.makeText(SearchResultActvity.this,
// "shouldOverrideUrlLoading=" + url, Toast.LENGTH_LONG)
// .show();
if (url.contains("http://v.youku.com/")) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("url", url);
bundle.putString("title", "");
intent.putExtras(bundle);
intent.setClass(SearchResultActvity.this, VideoActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_bottom_to_up,
R.anim.exit);
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
// progress.setVisibility(View.GONE);
Log.i("wxl", "onPageFinished url=" + url);
Toast.makeText(SearchResultActvity.this, "onPageFinished=" + url,
Toast.LENGTH_LONG).show();
super.onPageFinished(view, url);
}
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mWebview.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK) {
mWebview.goBack(); // goBack()表示返回webView的上一页面
return true;
}
return super.onKeyDown(keyCode, event);
}
}
115、Android 代码设置Drawableleft
Android中有时需动态设置控件四周的drawble图片,这个时候就需要调用 setCompoundDrawables(left, top, right, bottom),四个参数类型都是drawable
Button继承TextView,所以可以采用相同的设置方法
方法一.XML方式
方法二.JAVA代码
Drawable img_on, img_off;
Resources res = getResources();
img_off = res.getDrawable(R.drawable.btn_strip_mark_off);
//调用setCompoundDrawables时,必须调用Drawable.setBounds()方法,否则图片不显示
img_off.setBounds(0, 0, img_off.getMinimumWidth(), img_off.getMinimumHeight());
btn.setCompoundDrawables(img_off, null, null, null); //设置左图标
114、Json解析
(1)、
http://v.youku.com/player/getPlayList/VideoIDS/XNzI3MzE2ODk2
String fileid;
String sid;
String p1, p2;
String result = responseInfo.result;
JSONObject jsobj;
String mp4id = null;
String flvid = null;
String format = null;
JSONObject obj3 = null;
try {
jsobj = new JSONObject(result);
JSONArray jsonarr = jsobj.getJSONArray("data");
JSONObject obj1 = jsonarr.getJSONObject(0);
seed = obj1.getDouble("seed");
JSONObject obj2 = obj1
.getJSONObject("streamfileids");
fileid = obj2.getString("mp4");
obj3 = obj1.getJSONObject("segs");
JSONArray mp4arr = obj3.getJSONArray("mp4");
JSONObject o = mp4arr.getJSONObject(0);
p2 = o.getString("k");
Log.d("wxl", "size=" + o.getString("size"));
} catch (JSONException e) {
e.printStackTrace();
}
(2)、
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
(3)、json = "[{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}, {\"name\":\"min\", \"age\"=20, \"male\":false, \"address\":{\"street\":\"heiShiJiao\", \"city\":\"daLian\", \"country\":\"china\"}}]"
采用android内置的org.json包解析JSON数组.
List<Person> persons = new ArrayList<Person>();
JSONArray jsonArray = new JSONArray(json);
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean male = jsonObject.getBoolean("male");
JSONObject addressJSON = jsonObject.getJSONObject("address");
String street = addressJSON.getString("street");
String city = addressJSON.getString("city");
String country = addressJSON.getString("country");
Address address = new Address(street, city, country);
Person person = new Person(name, age, male, address);
persons.add(person);
}
System.out.println(persons);
采用gson库解析JSON数组
Gson gson = new Gson();
Type listType = new TypeToken<List<Person>>(){}.getType();
List<Person> persons = gson.fromJson(json, listType);
(4) {"ret":0,"pay_token":"014FEA19395DCC64C64A176A305E9624","pf":"desktop_m_qq-10000144-android-2002-","query_authority_cost":265,"authority_cost":6066,"openid":"0B494E1BAB8629C46F9AA760B3B7BA48","expires_in":7776000,"pfkey":"53284a43a87afa13898ee13d28be9317","msg":"","access_token":"13625DA4E43FF130B27D09A3B9AB975A","login_cost":928}
JSONObject jSONObject = (JSONObject) response;
try {
Log.d("wxl", "openid=" + jSONObject.getString("openid"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
②群:376526418 | |
③群:370527306 |
那不妨支付宝扫描以下二维码,小额赞助一下作者一杯咖啡费 #^_^#
本文出自吴小龙同學,欢迎转载,转载请标明来源地址:http://wuxiaolong.me/android/2014/12/29/Android/
留言列表