> For the complete documentation index, see [llms.txt](https://bookmarks.gitbook.io/android-bookmarks/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bookmarks.gitbook.io/android-bookmarks/android/di-san-pian-bian-jie-suo-yin/dai_ma_sui_pian.md).

# 3.3.代码

## 1 显示图片所使用的uri：

```
String imageUri = "http://site.com/image.png"; // from Web
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
String imageUri = "content://media/external/audio/albumart/13"; // from content provider
String imageUri = "assets://image.png"; // from assets
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
注意：使用drawable://除非你真的需要他。时刻要注意使用本地图片加载方法：setImageResource带代替ImageLoader。
```

## 2 监听网络变化

系统常量：ConnectivityManager.CONNECTIVITY\_ACTION\
action : "android.net.conn.CONNECTIVITY\_CHANGE"

```
 //在Androidmanifest中加入
 //<uses-permission android:name="android.permission.ACCESS_NETWOR
// 注册网络监听广播
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
mContext.registerReceiver(mNetWorkChangeReceiver, intentFilter);
```

## 3  Toast消息框重复提示

```
      //解决思路：判空处理
      private Toast mToast;  
      public void showToast(String text) {    
          if(mToast == null) {    
              mToast = Toast.makeText(TestActivity.this, text, Toast.LENGTH_SHORT);    
          } else {    
              mToast.setText(text);      
              mToast.setDuration(Toast.LENGTH_SHORT);    
          }    
          mToast.show();    
      }    

      //SuperToast 类库 使用避免重复  
      if (mSuperToast!=null){
               mSuperToast.setText("message:"+count);
               mSuperToast .setDuration(AttributeUtils.getDuration(getActivity()));
               mSuperToast .setFrame(AttributeUtils.getFrame(getActivity()));
               mSuperToast .setColor(AttributeUtils.getColor(getActivity()));
               mSuperToast .setAnimations(AttributeUtils.getAnimations(getActivity()));
            }else{
               mSuperToast= new SuperToast(getActivity());
               mSuperToast.setText("SuperToast" + count);
               mSuperToast .setDuration(AttributeUtils.getDuration(getActivity()));
               mSuperToast .setFrame(AttributeUtils.getFrame(getActivity()));
               mSuperToast .setColor(AttributeUtils.getColor(getActivity()));
               mSuperToast .setAnimations(AttributeUtils.getAnimations(getActivity()));
              // mSuperToast  .setColor(AttributeUtils.getColor(getActivity()));
           }
            mSuperToast.cancelAllSuperToasts();
            mSuperToast.show();
```

参考文献 [android 关于Toast重复显示解决方法](http://blog.csdn.net/onlyonecoder/article/details/8624942)

## 4 TextView加粗字体

```
//在代码中设置：  
TextView tv = (TextView)findViewById(R.id.tv); 
TextPaint tp = tv.getPaint(); 
tp.setFakeBoldText(true); 
//在xml中设置
android:textStyle="bold"
```

## 5 监听Back键按下事件

```
  /** 
     * 监听Back键按下事件,方法1: 
     * 注意: 
     * super.onBackPressed()会自动调用finish()方法,关闭 
     * 当前Activity. 
     * 若要屏蔽Back键盘,注释该行代码即可 
     */  
    @Override  
    public void onBackPressed() {  
        super.onBackPressed();  
        System.out.println("按下了back键   onBackPressed()");         
    }  


 /** 
    * 监听Back键按下事件,方法2: 
    * 注意: 
    * 返回值表示:是否能完全处理该事件 
    * 在此处返回false,所以会继续传播该事件. 
    * 在具体项目中此处的返回值视情况而定. 
    */  
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {  
             System.out.println("按下了back键   onKeyDown()");  
             return false;  
        }else {  
            return super.onKeyDown(keyCode, event);  
        }  

    }  
```

## 6 判断Activity属于任务栈中

```
      /**
 * 判断是否存在Activity
 *
 * @param context     上下文
 * @param packageName 包名
 * @param className   activity全路径类名
 * @return {@code true}: 是<br>{@code false}: 否
 */
public static boolean isActivityExists(Context context, String packageName, String className) {
    Intent intent = new Intent();
    intent.setClassName(packageName, className);
    return !(context.getPackageManager().resolveActivity(intent, 0) == null ||
            intent.resolveActivity(context.getPackageManager()) == null ||
            context.getPackageManager().queryIntentActivities(intent, 0).size() == 0);
}
```

## 7 ActionBar 返回键处理

```
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) { 
    case android.R.id.home://关键代码
       onBackPressed();
    break;
  }
   return true;
}
```

## 8 RecycleView加载更多

```
   //原始分页
  /*  mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        private boolean loading = true;
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            int visible  = layoutManager.getChildCount();
            int total = layoutManager.getItemCount();
            int past=layoutManager.findFirstCompletelyVisibleItemPosition();
            if (loading) {
            //previousTotal 未全局变量
                if (total > previousTotal) {
                    loading = false;
                    previousTotal = total;
                }
            }
            if (!loading&&((visible + past) >= total)){
                Log.d("mRecyclerView", "visible:" + visible + " past:" + past + " total:" + total
                        +" previousTotal:"+ previousTotal+" loading："+loading);
                mPage++;
                startSearch();
                loading = true;
            }
        }
    });*/    
```

## 9 EditText获取焦点状态

```
   EditText searchView = (EditText)findViewById(R.id.search_text);
   searchView.setOnFocusChangeListener(new android.view.View.
    OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
    if (hasFocus) {
        // 此处为得到焦点时的处理内容
    } else {
        // 此处为失去焦点时的处理内容
    }
}});    
```

## 10 SD卡总容量

```
 public long getSDAllSize(){  
 //取得SD卡文件路径  
 File path = Environment.getExternalStorageDirectory();   
 StatFs sf = new StatFs(path.getPath());   
 //获取单个数据块的大小(Byte)  
 long blockSize = sf.getBlockSize();   
 //获取所有数据块数  
 long allBlocks = sf.getBlockCount();  
 //返回SD卡大小  
 //return allBlocks * blockSize; //单位Byte  
 //return (allBlocks * blockSize)/1024; //单位KB  
 return (allBlocks * blockSize)/1024/1024; //单位MB  
 }     
```

## 11 SD卡剩余空间

```
 SD卡剩余空间
 public long getSDFreeSize(){  
 //取得SD卡文件路径  
 File path = Environment.getExternalStorageDirectory();   
 StatFs sf = new StatFs(path.getPath());   
 //获取单个数据块的大小(Byte)  
 long blockSize = sf.getBlockSize();   
 //空闲的数据块的数量  
 long freeBlocks = sf.getAvailableBlocks();  
 //返回SD卡空闲大小  
 //return freeBlocks * blockSize;  //单位Byte  
 //return (freeBlocks * blockSize)/1024;   //单位KB  
 return (freeBlocks * blockSize)/1024 /1024; //单位MB  
 }    
```

## 12 SD卡是否存在

```
private boolean ExistSDCard() {  
   if(android.os.Environment.getExternalStorageState()
   .equals(  
    android.os.Environment.MEDIA_MOUNTED)) {  
    return true;  
  } else  
   return false;  
 }
```

## 13 判断是否为合法IP

```
 /**
  * 判断是否为合法IP
  *
  * @return the ip
  */
public static boolean isIP(String ipAddress) {
  String ip ="((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?    \d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))";
  Pattern pattern = Pattern.compile(ip);
  Matcher matcher = pattern.matcher(ipAddress);
  return matcher.matches();
}           
```

## 14 获取手机可用内存和总内存：

```
private String[] getTotalMemory() {    
        String[] result = {"",""};  //1-total 2-avail    
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();      
        mActivityManager.getMemoryInfo(mi);      
        long mTotalMem = 0;    
        long mAvailMem = mi.availMem;    
        String str1 = "/proc/meminfo";    
        String str2;    
        String[] arrayOfString;    
        try {    
            FileReader localFileReader = new FileReader(str1);    
            BufferedReader localBufferedReader = new BufferedReader(localFileReader, 8192);    
            str2 = localBufferedReader.readLine();    
            arrayOfString = str2.split("\\s+");    
            mTotalMem = Integer.valueOf(arrayOfString[1]).intValue() * 1024;    
            localBufferedReader.close();    
        } catch (IOException e) {    
            e.printStackTrace();    
        }    
        result[0] = Formatter.formatFileSize(this, mTotalMem);    
        result[1] = Formatter.formatFileSize(this, mAvailMem);    
        Log.i(TAG, "meminfo total:" + result[0] + " used:" + result[1]);    
        return result;    
    }  
```

## 14 获取屏幕高度

```
      private void getWeithAndHeight(){    
        //这种方式在service中无法使用，    
        DisplayMetrics dm = new DisplayMetrics();    
        getWindowManager().getDefaultDisplay().getMetrics(dm);    
        String width = dm.widthPixels;              //宽    
        String height = dm.heightPixels;           //高    

        //在service中也能得到高和宽    
        WindowManager mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);    
        width = mWindowManager.getDefaultDisplay().getWidth();    
        height = mWindowManager.getDefaultDisplay().getHeight();    
      }          
```

## 15 获取屏幕密度

```
public static float getDensity(Context ctx) {

DisplayMetrics metrics = new DisplayMetrics();
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);

return metrics.density;
```

}

## 16 应用于View的获取控件实例

```
/**
  * 应用于View的获取控件实例
  * @param view
  * @param id
  * @return
  */
  @SuppressWarnings("unchecked")
 public static <T extends View> T $(View view, int id)   {
    return (T) view.findViewById(id);
 } 
```

## 17  应用于Activity的获取控件实例

```
    /**
     * 应用于Activity的获取控件实例
    *
     * @param activity
     * @param id
     * @return
    */
    @SuppressWarnings("unchecked")
    public static <T extends View> T $(Activity activity, int id) {
    return (T) activity.findViewById(id);
    }     
```

## 18 shouldOverrideUrlLoading(WebView view, String url)被废弃

```
 在Android N中 
 shouldOverrideUrlLoading(WebView view, String url)被废弃，
 改为shouldOverrideUrlLoading(WebView view, WebResourceRequest request)，
 我们可以通过request.getUrl()来获取url。

 @Override
 public boolean shouldOverrideUrlLoading(WebView view,  WebResourceRequest request) {
return shouldOverrideUrlLoading(view,  request.getUrl().toString());
}
```

## 19 Android系统键盘显示隐藏监听,显示则隐藏，没有显示则弹出

```
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
    imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
    通过判断高度来判断键盘状态

detailMainRL = (RelativeLayout) findViewById(R.id.home_news_detail_main_rl);
        detailMainRL.getViewTreeObserver().addOnGlobalLayoutListener(
        new OnGlobalLayoutListener(){
            @Override
            public void onGlobalLayout()
            {

                int heightDiff = detailMainRL.getRootView().getHeight() - detailMainRL.getHeight();
                Log.v(TAG, "detailMainRL.getRootView().getHeight() = " + detailMainRL.getRootView().getHeight());
                Log.v(TAG, "detailMainRL.getHeight() = " + detailMainRL.getHeight());

                if (heightDiff > 100)
                { // 说明键盘是弹出状态
                    Log.v(TAG, "键盘弹出状态");
                    commentBoxRL.setVisibility(View.VISIBLE);
                } else{
                    Log.v(TAG, "键盘收起状态");
                    commentBoxRL.setVisibility(View.GONE);
                }
            }
        });                                                                                                                                                                           
```

## 20 Android ActionBar 菜单隐藏

```
    @Override  
    public boolean onPrepareOptionsMenu(Menu menu) {  
        Log.e("isMenuShuffle",isMenuShuffle + "");  
        if(isMenuShuffle)  
        {  
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(true);  
        }else  
        {  
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(false);  
        }  
        return super.onPrepareOptionsMenu(menu);  
    }  
```

## 21 PopupWindow 点击外部和返回键 消失处理 [原理](http://www.cnblogs.com/popfisher/p/5608717.html) [详解](http://blog.csdn.net/harvic880925/article/details/49278705)

```
mPopupWindow=new PopupWindow(selectView, ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,true);
mPopupWindow.setFocusable(false);
mPopupWindow.setOutsideTouchable(false);
// 这个是为了点击“返回Back”也能使其消失，并且并不会影响你的背景
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());    
//本方法必须写在最后，否则会存在部分手机兼容问题  
  mPopupWindow.showAtLocation(findViewById(R.id.EditActivity_rootView), Gravity.BOTTOM,0,0);  
```

## 22 [Java date 判断大小- 日期类型](http://jackroomage.iteye.com/blog/1171050)

```
//date中compareTo的用法。也是比较时间大小的，相等返回0，大于返回1，小于返回-1.
public class Demo8 {
public static void main(String[] args) throws ParseException {
   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
   Date oldDate1 = format.parse("2012-05-12 15:16:00"); //这里时间可以自己定
   Date oldDate2 = format.parse("2011-05-12 15:16:00"); //这里时间可以自己定
   System.out.println(oldDate1.compareTo(oldDate2)); //判断,如果时间在这时间后,就执行后面操作
 }
}     
```

## 23 android 动态修改menu item的内容title

```
1）全局量：
MenuItem gMenuItem=NULL;

2）//创建菜单时keep
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu){
getMenuInflater().inflate(R.menu.menu, menu);
gMenuItem= menu.findItem(R.id.action_Seach);
return true;
}

3）需要时修改
//ANY PLACE
if(gMenuItem!=NULL){
gMenuItem.setTitle("Changed");
}
```

## 24 判断当前线程是否为主线程

```
  public boolean isMainThread() {
    return Looper.getMainLooper() == Looper.myLooper();
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bookmarks.gitbook.io/android-bookmarks/android/di-san-pian-bian-jie-suo-yin/dai_ma_sui_pian.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
