Android 项目总结(1)_20180808

关于前期项目中的问题,做一下总结:后续还是用MK来写,直接复制,文本样式没了。

1.List对象 排序

public interface Comparable<T> {

int compareTo(T var1);

}

让Bean执行此接口,重写compareTo() 来对比对应的属性

Collections.sort(output); 最后使用集合的sort方法即可

2. 组合View

public class HeaderViewextends RelativeLayout {

public HeaderView(Context context, AttributeSet attrs) {

super(context, attrs);

initView(context);

}

public void initView(Context context) {

View view = LayoutInflater.from(context).inflate(R.layout.header, this);

}

在子View 比较多,全部在Activity 中代码比较杂乱时,通过抽象成View的模式

set/get 一些参数和属性,代码更加清晰(配合MVP 模式)

(Contract 中定义presenter数据代理+view显示,Activity/Fragment 中只负责主要的界面显示)

3.获取布局截图

frameLayout.setDrawingCacheEnabled(true);

Bitmap tBitmap = frameLayout.getDrawingCache();

// 拷贝图片,否则在setDrawingCacheEnabled(false)以后该图片会被释放掉

tBitmap = tBitmap.createBitmap(tBitmap);

frameLayout.setDrawingCacheEnabled(false);

需要设置Activity为 android:hardwareAccelerated="false" (否则拿到的为null)

从图片缓存中获取Bitmap

4.枚举与Int

public enum MoreBean {

MoreActivity(0),

ScannerActivity(1);

private int type;

MoreBean(int iValue) {

this.type = iValue;

}

public int type() {

return this.type;

}

}

MoreBean myType = MoreBean.values()[1]; index 转化为枚举

int index = MoreBean.MoreActivity.type(); 枚举转化为 int

4.基于MigrationHelper的DB保留数据升级

@Override

public void onUpgrade(Database db, int oldVersion, int newVersion) {

MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {

@Override

public void onDropAllTables(Database db, boolean ifExists) {

DaoMaster.dropAllTables(db, ifExists);

}

}, VideosDao.class);

}

Helper直接拿来用

5.转化File与Uri

Android N以后,不能直接从文件得到Uri

需要设置manifest FileProvider 并配合

File file = new File(picturePath);

Uri uri = null;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID+".provider", file);

} else {

uri = Uri.fromFile(file);

}

6.WebView 与alert

@Override

public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();

result.confirm();//return true,表示拦截alert, 需要给js返回结果,否则js不会往下执行

return true;

}

WebView 中捕获js的alert 弹窗,一定要有 JsResult 的确认,否则js不会往下执行

6.屏蔽返回按键

配合style <item name="android:windowCloseOnTouchOutside">false</item> 来使用

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode == KeyEvent.KEYCODE_BACK){

return true;

}

return super.onKeyDown(keyCode, event);

}

7.Fragment 与Adapter

Fragment中,onCreate 第一次创建时,初始化一些数据

onCreateView 在每次显示,都会重新绘制view 对于一些非实时数据,不宜多次refresh 数据,而应该在onCreate

中进行请求,结合onCreate 中创建Adapter 后续只是View的渲染,数据不用变

Adapter适配器作为数据而存在,可以在onCreate 中创建,并new List 数据

后续再setData notifyDataChange()

8.ViewPager 预加载

1 ViewPager setOffscreenPageLimit 3

设置预加载量3,除了显示的Fragment ,之后的3个Fragment会被预加载

9.Debuggable 调试开关

1 android:debuggable="true"

设置参数,在编译release 版本时,覆盖安装,可以run-as 查看数据库

https://blog.csdn.net/huaxun66/article/details/52288969

10.Webview 查找数据

存在数据不高亮的情况,通过反射调用setFindIsUp 设置即可

public void toogleSetFindIsUp(WebView webView) {

try {

for (Method m : WebView.class.getDeclaredMethods()) {

if (m.getName().equals("setFindIsUp")) {

m.setAccessible(true);

m.invoke((webView), true);

break;

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

11.图片小红点

图片或文字上的小红点:自定义FrameLayout 下的ImageView 和View(红点)

配合attr 和set方法,设置红点显示与隐藏

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<ImageView

android:id="@+id/red_image"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_centerInParent="true" />

<View

android:id="@+id/red_point"

android:layout_width="@dimen/offset_5dp"

android:layout_height="@dimen/offset_5dp"

android:visibility="gone"

android:layout_gravity="end"

android:background="@drawable/all_item_red"/>

</FrameLayout>

猜你喜欢

转载自blog.csdn.net/qq_42022061/article/details/81511779
今日推荐