ExifInterface exif = new AbsolutePath());
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, vert(latitude));
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, GPS.latitudeRef(latitude));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, vert(longitude));
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, GPS.longitudeRef(longitude));
exif.saveAttributes();
/** @author fabien*/
public class GPS {private static StringBuilder sb = new StringBuilder(20);/*** returns ref for latitude which is S or N.* @param latitude* @return S or N*/public static String latitudeRef(double latitude) {return latitude<0.0d?"S":"N";}/*** returns ref for latitude which is S or N.* @param latitude* @return S or N*/public static String longitudeRef(double longitude) {return longitude<0.0d?"W":"E";}/*** convert latitude into DMS (degree minute second) format. For instance<br/>* -79.948862 becomes<br/>* 79/1,56/1,55903/1000<br/>* It works for latitude and longitude<br/>* @param latitude could be longitude.* @return*/synchronized public static final String convert(double latitude) {latitude=Math.abs(latitude);int degree = (int) latitude;latitude *= 60;latitude -= (degree * 60.0d);int minute = (int) latitude;latitude *= 60;latitude -= (minute * 60.0d);int second = (int) (latitude*1000.0d);sb.setLength(0);sb.append(degree);sb.append("/1,");sb.append(minute);sb.append("/1,");sb.append(second);sb.append("/1000");String();}
}
如何在Android上的exif数据中保存GPS坐标?
关闭硬件加速
android:hardwareAccelerated=“false”
AndroidBug5497Workaround
public class AndroidBug5497Workaround {// For more information, see // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.public static void assistActivity (Activity activity) {new AndroidBug5497Workaround(activity);}private View mChildOfContent;private int usableHeightPrevious;private FrameLayout.LayoutParams frameLayoutParams;private AndroidBug5497Workaround(Activity activity) {FrameLayout content = (FrameLayout) activity.findViewById(android.t);mChildOfContent = ChildAt(0);ViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {possiblyResizeChildOfContent();}});frameLayoutParams = (FrameLayout.LayoutParams) LayoutParams();}private void possiblyResizeChildOfContent() {int usableHeightNow = computeUsableHeight();if (usableHeightNow != usableHeightPrevious) {int usableHeightSansKeyboard = RootView().getHeight();int heightDifference = usableHeightSansKeyboard - usableHeightNow;if (heightDifference > (usableHeightSansKeyboard/4)) {// keyboard probably just became visibleframeLayoutParams.height = usableHeightSansKeyboard - heightDifference;} else {// keyboard probably just became hiddenframeLayoutParams.height = usableHeightSansKeyboard;}questLayout();usableHeightPrevious = usableHeightNow;}}private int computeUsableHeight() {Rect r = new Rect();WindowVisibleDisplayFrame(r);return (r.bottom - r.top);}
}
修改.idea-&l,将project-jdk-name="JDK"改为对应的版本名字,如:11(Project Structure中配置的gradle jdk版本)
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"><component name="DesignSurface"><option name="filePathToZoomLevelMap"><map><entry key="..:/work/AndroidProject/DEMO/app/src/main/res/layout/l" value="0.20364583333333333" /></map></option></component><component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="JDK" project-jdk-type="JavaSDK"><output url="file://$PROJECT_DIR$/build/classes" /></component><component name="ProjectType"><option name="id" value="Android" /></component>
</project>
改为
...<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="11" project-jdk-type="JavaSDK"><output url="file://$PROJECT_DIR$/build/classes" /></component>...
原帖
//是否使用特殊的标题栏背景颜色,android5.0以上可以设置状态栏背景色,如果不使用则使用透明色值protected boolean useThemestatusBarColor = true;//是否使用状态栏文字和图标为暗色,如果状态栏采用了白色系,则需要使状态栏和图标为暗色,android6.0以上可以设置protected boolean useStatusBarColor = true;protected void setStatusBar() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0及以上Window window = getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);DecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);//根据上面设置是否对状态栏单独设置颜色if (useThemestatusBarColor) {window.setStatusBarColor(getResources().lor.blue));//设置状态栏背景色} else {window.setStatusBarColor(Color.TRANSPARENT);//透明}}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && useStatusBarColor) {//android6.0以后可以对状态栏文字颜色和图标进行修改getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);}}
原帖
再学一遍android:fitsSystemWindows属性
Android关于StatusBar(状态栏)总结
需要在项目的gradle.properties中添加
android.useAndroidX=true
ableJetifier=true
android添加依赖ARouter报错Manifest merger failed
gradle中配置android.useAndroidX与ableJetifier使应用对support库的依赖自动转换为androidx的依赖
Android矢量图(三)–VectorDrawable渐变色
不是每次都会调用onRestart()
Android activity onNewIntent 调用时机
How to Select Files in Android Easily? Connecting Storage Access Framework and Activity Result API
将.idea路径下的l文件删除,再sync
参考
object Apps {const val compileSdk: Int = 30const val minSdk = 21const val targetSdk = 30
// const val versionCode = 1
// const val versionName = "1.0.0"
}
问题:报 Overload resolution ambiguity错误
解决:删除掉buildSrc目录下的.gradle和build目录,再gradle编译生成新的
链接:
链接:
链接:
D:workAndroidProjectxxappbuildgeneratedap_generated_sourcesdevDebugoutcomxxDataBinderMapperImpl.java:9: ����: �Ҳ�������
databinding.FragmentMeBindingImpl;^����: �� FragmentMeBindingImpl�: ����� databinding
方法:Help->Edit Custom VM Options… 打开 vmoptions 文件,加入-ding=UTF-8,重启即可
# custom Android Studio VM options, see .html
-ding=UTF-8
D:workAndroidProjectxxappbuildgeneratedap_generated_sourcesdevDebugoutcomxxDataBinderMapperImpl.java:9: 错误: 找不到符号
databinding.FragmentMeBindingImpl;^符号: 类 FragmentMeBindingImpl位置: 程序包 databinding
参考
fig.path=D:/Android/.AndroidStudio/configidea.system.path=D:/Android/.AndroidStudio/systemidea.plugins.path=${fig.path}/pluginsidea.log.path=${idea.system.path}/log
Android的SDK位置 例如:D:Androidsdk
也可用以下操作修改SDK路径:Appearance & Behavior → System Settings → Android SDK中,点击 Android SDK Location → Edit
Android 虚拟机的保存位置,例如:D:Androidavd
gradle仓库存放路径,例如:D:adle
关于Android Q分区存储的一些适配心得
Android10填坑适配指南,实际经验代码,拒绝翻译
开源中国客户端 Android Q 经验适配指南,含代码
Android-Q适配-存储方式
double f = 111231.5585;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2, RoundingMode.HALF_UP).doubleValue();
// 在这里使用BigDecimal ,并且采用setScale方法来设置精确度,
//同时使用RoundingMode.HALF_UP表示使用最近数字舍入法则来近似计算。
DecimalFormat("#.00").format(3.1415926)
// #.00 表示两位小数 #.0000四位小数 以此类推…
double d = 3.1415926;
String result = String .format("%.2f");
// %.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型。
引自 .html
将某一手势操作交给GestureDetector时,GestureDetector重写了几个方法,但是onScroll没有执行,其他的onDOwn,OnLongPress都有执行。
解决:onDOwn方法的返回值返回true
虽然此时onScroll(滑动)方法调用了,但是打印结果表示:该方法会调用多次,有时并不是我所需要的,而onFling表示滑动,当手离开时调用,但是打印的结果显示并没有调用;
解决:在之前的基础上再将onScroll返回false即可!
原文链接:
// 第一种
Drawable drawable = getResources().getDrawable(R.drawable.ic_coin);
drawable.setBounds(0,0, IntrinsicWidth(), IntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
// 第一种
ImageSpan imageSpan = new ImageSpan(mContext, R.drawable.ic_coin);stringBuilder.setSpan(imageSpan, size-1, size, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
.html
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {private boolean isToBottom = false;@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {ScrollStateChanged(recyclerView, newState);if (newState == RecyclerView.SCROLL_STATE_IDLE && isToBottom) {loadMore();}}@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {Scrolled(recyclerView, dx, dy);isToBottom = isSlideToBottom(recyclerView);swipeRefresh.setEnabled(isSlideToTop(recyclerView));}});/*** 判断是否滑动到底部*/public static boolean isSlideToBottom(RecyclerView recyclerView) {if (recyclerView == null) return false;return recyclerViewputeVerticalScrollExtent() + recyclerViewputeVerticalScrollOffset()>= recyclerViewputeVerticalScrollRange();}/*** 判断是否滑动到顶部*/public static boolean isSlideToTop(RecyclerView recyclerView) {if (recyclerView == null) return false;return recyclerViewputeVerticalScrollOffset() == 0;}
/*** 判断是否滑动到底部*/public static boolean isSlideToBottom(RecyclerView recyclerView) {return !recyclerView.canScrollVertically(1); //表示是否能向上滚动,false 表示已经滚动到底部 }/*** 判断是否滑动到顶部*/public static boolean isSlideToTop(RecyclerView recyclerView) {return !recyclerView.canScrollVertically(-1); // 表示是否能向下滚动,false 表示已经滚动到顶部}
RecyclerView rvMessage = findViewById(R.id.rv_message);GridLayoutManager layoutManager = new GridLayoutManager(this, 1, RecyclerView.VERTICAL, false);rvMessage.setLayoutManager(layoutManager);MessageAdapter messageAdapter = new MessageAdapter();rvMessage.setAdapter(messageAdapter);rvMessage.addOnScrollListener(new RecyclerView.OnScrollListener() {private int lastVisible = 0;@Overridepublic void onScrollStateChanged([@NonNull]() RecyclerView recyclerView, int newState) {ScrollStateChanged(recyclerView, newState);if (newState == RecyclerView.SCROLL_STATE_IDLE &&lastVisible + 1 == ItemCount()) {// 已滑动到底部}}[@Override]()public void onScrolled([@NonNull]() RecyclerView recyclerView, int dx, int dy) {Scrolled(recyclerView, dx, dy);lastVisible = layoutManager.findLastCompletelyVisibleItemPosition();}});
参考
=
Color.parseColor(“#FF00FF”)
Resources().lorTest)
用以下替换
Color(context, _color)
//源码
public static final int getColor(Context context, int id)
{
final int version = Build.VERSION.SDK_INT;
if (version >= 23) {Color(context, id);
} else {Resources().getColor(id);}
}
SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch)
如果ListView没有headerView或者footerView的时候,与listView相关联的Adapter就是传进来的参数Adapter,如果有,就将原来的Adapter包装成HeaderViewListAdapter,HeaderViewListAdapter有个方法getWrappedAdapter,该方法能返回被包装的HeaderViewListAdapter的ListAdapter。
HeaderViewListAdapter headerViewListAdapter = (HeaderViewListAdapter) Adapter();
ContactAdapter contactAdapter = (ContactAdapter) WrappedAdapter();
drawable/l
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android=""android:shape="line"><stroke android:color="@color/colorBlack"android:dashGap="2dp"android:dashWidth="5dp"android:width="1dp" /><size android:width="1dp" />
</shape>
布局文件中:(需要设置 layerType为software)
<Viewandroid:layout_width="match_parent"android:layout_height="2dp"android:background="@drawable/line_dash"android:layerType="software"/>
在Module的gradle.build文件添加依赖,和 packagingOptions,和 useLibrary ‘org.apache.http.legacy’
android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId id.webdemo"minSdkVersion 16targetSdkVersion 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('), 'proguard-rules.pro'}}packagingOptions {exclude 'META-INF/DEPENDENCIES'exclude 'META-INF/NOTICE'exclude 'META-INF/LICENSE'exclude ''exclude ''}//会加载Andrdoid自带的jar包 org.apache.http.legacy.jaruseLibrary 'org.apache.http.legacy'
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])testCompile 'junit:junit:4.12'compile 'com.android.support:appcompat-v7:23.1.1'//下面这些不会起作用compile 'org.apache.httpcomponents:httpclient:4.3.6'compile 'org.apache.httpcomponents:httpcore:4.3.2'
}
<resources><declare-styleable name="app"><attr name="toolbarHeight" format="dimension" /></declare-styleable>
</resources>
<style name="BaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="colorButtonNormal">@color/blueLight</item><item name="colorControlHighlight">@color/background</item><item name="toolbarHeight">?android:attr/actionBarSize</item></style>
<androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/toolbarHeight"app:contentInsetStart="0dp"app:layout_collapseMode="pin" />
此方法是给主界面设置闪屏页主题,在主界面中再用代码换回主界面主题,实现无闪屏Activity达到闪屏页的效果。
<resources><!-- 主界面主题 --><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style><!-- 闪屏主题 --><style name="AppTheme.Launcher"><item name="android:windowBackground">@drawable/launch_screen</item></style>
<resources>
<layer-list xmlns:android=""android:opacity="opaque"><item android:drawable="@color/white" /><bitmapandroid:gravity="center"android:src="@drawable/img_splash" />
</layer-list>
<activityandroid:name=".ui.activity.MainActivity"android:theme="@style/AppTheme.Launcher"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceStated) {setTheme(R.style.AppTheme);Create(savedInstanceStated);// ...}
}
注:若有闪屏Activity可以直接使用主题设置闪屏背景,无需在布局设置背景,所以没有背景显示时的切换问题
链接:
tv.PaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
tv.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
tv.invalidate();
tv.PaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
tv.getPaint().setFlags(0);
tv.invalidate();
参考:.htm
// 自定义类public class TopSmoothScroller extends LinearSmoothScroller {public TopSmoothScroller(Context context) {super(context);}@Overrideprotected int getHorizontalSnapPreference() {return SNAP_TO_START;//具体见源码注释}@Overrideprotected int getVerticalSnapPreference() {return SNAP_TO_START;//具体见源码注释}
}// 使用LinearSmoothScroller scroller = new TopSmoothScroller(CourseActivity.this);scroller.setTargetPosition(position);linearLayoutManager.startSmoothScroll(scroller);
在布局View添加属性 android:layerType=“software”
Android Studio 3.0以后会在debug apk的manifest文件中加android:testOnly=”true” 属性,此属性无法在非开发者模式的手机上安装,VIVO OPPO即使在开发者模式也不能安装。
解决: 在gradle.properties文件中添加stOnly=false
Android关于沉浸式状态栏总结
Android状态栏微技巧,带你真正理解沉浸式模式
Android 沉浸式状态栏必知必会
刘海屏适配 与WindowInsets,DisplayCutout使用
.AndroidStudio文件夹修改
修改文件C:Program FilesAndroidAndroid Studiobinidea.properties中的
.gradle文件夹的修改
设置Android Studio中的
Settings->Build,Execution,Deployment->Gradle 中的Service directory path为D:/Android/.gradle
.android文件夹的修改
添加一个系统的环境变量ANDROID_SDK_HOME为D:/Android/avd
密度 | ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi |
---|---|---|---|---|---|---|
比例 | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
密度数 | 120dpi | 160dpi | 240dpi | 320dpi | 480dpi | 640dpi |
代表分辨率 | 240*320 | 320*480 | 480*800 | 720*1280 | 1080*1920 | 1440*2560 |
Launcher And Home | 36*36 | 48*48 | 72*72 | 96*96 | 144*144 | 192*192 |
Action Bar And Tab | 24*24 | 32*32 | 48*48 | 64*64 | 96*96 | 128*128 |
Notification | 18*18 | 24*24 | 36*36 | 48*48 | 72*72 | 96*96 |
Background | 320*426 | 320*470 | 480*640 | 720*1280 | 1080*1920 | 1440*2560 |
修改“C:UsersAdministrator.AndroidStudio2.3configoptionsl”文件<javadocPath><root type="composite"><root type="simple" url="file://D:/Android/sdk/platforms/reference/" /></root>
</javadocPath>
100% — FF
95% — F2
90% — E6
85% — D9
80% — CC
75% — BF
70% — B3
65% — A6
60% — 99
55% — 8C
50% — 80
45% — 73
40% — 66
35% — 59
30% — 4D
25% — 40
20% — 33
15% — 26
10% — 1A
5% — 0D
0% — 00
LinearLayout linearLayout = (LinearLayout) ChildAt(0);linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);linearLayout.setDividerPadding(CommonUtils.dp2px(this, 8));linearLayout.Drawable(this,R.drawable.layout_divider_vertical));
layout_l
<shape xmlns:android=""><solid android:color="@color/grayDark"/><size android:width="1dp"/>
</shape>
Color.parseColor(“#FF00FF”)
Resources().lorTest)
用一下替换
Color(context, _color)//源码 public static final int getColor(Context context, int id) { final int version = Build.VERSION.SDK_INT; if (version >= 23) { Color(context, id);} else {Resources().getColor(id); }}
SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch)
如果ListView没有headerView或者footerView的时候,与listView相关联的Adapter就是传进来的参数Adapter,如果有,就将原来的Adapter包装成HeaderViewListAdapter,HeaderViewListAdapter有个方法getWrappedAdapter,该方法能返回被包装的HeaderViewListAdapter的ListAdapter。
HeaderViewListAdapter headerViewListAdapter = (HeaderViewListAdapter) Adapter();
ContactAdapter contactAdapter = (ContactAdapter) WrappedAdapter();
drawable/l
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android=""android:shape="line"><stroke android:color="@color/colorBlack"android:dashGap="2dp"android:dashWidth="5dp"android:width="1dp"/><size android:width="1dp" /></shape>
布局文件中:(需要设置 layerType为software)
<Viewandroid:layout_width="match_parent"android:layout_height="2dp"android:background="@drawable/line_dash"android:layerType="software"/>
在Module的gradle.build文件添加依赖,和 packagingOptions,和 useLibrary ‘org.apache.http.legacy’
android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId id.webdemo"minSdkVersion 16targetSdkVersion 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('), 'proguard-rules.pro'}}packagingOptions {exclude 'META-INF/DEPENDENCIES'exclude 'META-INF/NOTICE'exclude 'META-INF/LICENSE'exclude ''exclude ''}//会加载Andrdoid自带的jar包 org.apache.http.legacy.jaruseLibrary 'org.apache.http.legacy'}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])testCompile 'junit:junit:4.12'compile 'com.android.support:appcompat-v7:23.1.1'//下面这些不会起作用compile 'org.apache.httpcomponents:httpclient:4.3.6'compile 'org.apache.httpcomponents:httpcore:4.3.2'}
android:configChanges="orientation|keyboardHidden|screenSize"
Move .android folder to E:Android
Create environment variable called ANDROID_SDK_HOME and set its value to E:AndroidSetting environment variable in Windows XP:Right-click on My Computer and choose "Properties")Click the "Advanced" tabClick the button "Environment Variables".Add New variable
View rootView = getWindow().getDecorView().findViewById(android.t);
或者:
View rootView = findViewById(android.t);
或者:
View rootView = findViewById(android.t).getRootView();
关于android.t,开发者文档中并没有给予说明,但经过测试它应该是用来获取setContentView()中设置的View。.html
getQuantityString() <resources><pluralsname="plural_name"><itemquantity=["zero" | "one" | "two" | "few" | "many" | "other"]>text_string</item></plurals>
</resources>.html#Plurals
/*** 检测应用是否在后台运行* [@param]() context context* [@return]() true 后台运行*/
public static boolean isBackgroundRunning(final Context context) {ActivityManager am = (ActivityManager) SystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> tasks = am.RunningAppProcesses().size());for (ActivityManager.RunningTaskInfo runningTaskInfo : tasks) {if (PackageName().PackageName())) {Log.d(TAG, "packageName:" + PackageName());Log.d(TAG, "className:" + ClassName());return true;}}return false;
}/*** 检测应用是否在后台运行* [@param]() context context* [@return]() true 前台运行*/
public static boolean isFrontRunning(Context context) {ActivityManager am = (ActivityManager) SystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {for (String activeProcess : processInfo.pkgList) {if (activeProcess.PackageName())) {Log.d(TAG, "packageName:" + activeProcess);Log.d(TAG, "className:" + processInfo.processName);return true;}}}}return false;
}
问题:
Error:Execution failed for task ':app:transformClassesWithDexForDevDebug'.
> com.android.ansform.TransformException: com.android.idemon.process.ProcessException: urrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
修改文件:
android {compileSdkVersion 21buildToolsVersion "21.1.0"defaultConfig {...minSdkVersion // Enabling multidex support.multiDexEnabled true}...
}dependencies {compile 'com.android.support:multidex:1.0.0'
}
Application类
&android:name=st.TestApplication">...
</application>public class TestApplication extends Application {protected void attachBaseContext(Context base) {super.attachBaseContext(base);MultiDex.install(this);}
}
详情:
.html
m 1 48*48px
h 1.5 72*72px
xh 2 96*96px
xxh 3 144*144px
xxxh 4 192*192px1.CTRL+A 再选择编辑中的“描边”就行。(选择自己喜欢的颜色、设置自己需要的宽度)
2.新建图层--矩形选框--反选--填充--快速蒙板--滤镜(多用几个)--退出蒙板--图层效果
3.矩形选区--快速蒙板--滤镜(各种滤镜有不同的效果,可以同时用多个滤镜)--退出蒙板--反选--删除--描边
1dp(Android)=1pt(iOS)
以48dp@160dpi计算的话
mdpi 48px (160dpi, 1x) 基础尺寸
hdpi 72px (240dpi, 1.5x)
xhdpi 96px (320dpi, 2x) 同iOS @2x
xxdpi 144px (480dpi, 3x) 同iOS @3x
xxxdpi 192px (640dpi, 4x)
链接:
在android开发中会遇到使用fragment切换页面,并且切换的页面都会有网络请求,网络请求成功后会更新相应的fragment页面。如果使用异步网络请求组件android-async-http,会出现这样的情况,当你快速的切换fragment时,每个fragment都会发出新的请求。例如:fragmentA发了网络请求,又切换到了fragmentB,fragmentB又发了网络请求,然后快速的切换两个fragment,切换多次后可能会出现,fragmentA发出的请求返回成功并且使用handler发出消息请求改变fragmentA中的UI时,这时当前的页面正是fragmentB。此时会报空指针错误。
解决此类问题,可以通过第一次加载时缓存,再次切换到此页面时,只有下拉才能请求新数据。另一种方法是,设置一个public static volatile int flag;变量,如果flag为1时则表示当前页面在fragmentA中,当flag为2时表示当前页面在fragmentB中,只当handler收到消息并且flag=1时才能更新fragmentA中的数据。第二种方法实现起来比较繁锁,推荐使用第一种方法。其中1、2、3这些最好存放在一个枚举类型中。
[转]
1)Activity.runOnUiThread(Runnable)
2)View.post(Runnable)
public void onClick(View v) {new Thread(new Runnable() {public void run() {final Bitmap b = loadImageFromNetwork();mImageView.post(new Runnable() {public void run() {mImageView.setImageBitmap(b);}});}}).start();
}
3)View.postDelayed(Runnable, long)
4)Handler
final Handler myHandler = new Handler();(new Thread(new Runnable() {@Overridepublic void run() {final Bitmap b = loadImageFromNetwork();myHandler.post(new Runnable() { @Overridepublic void run() {mImageView.setImageBitmap(b);}});}})).start();
}
/*** 调整ListView嵌套后,根据子ListView的高度重设父ListView的高度* @param listView*/public static void setListViewHeightBasedOnChildren(ListView listView) {ListAdapter listAdapter = Adapter();if (listAdapter == null) {return;}int totalHeight = 0;for (int i = 0; i < Count(); i++) {View listItem = View(i, null, listView);asure(0, 0);totalHeight += MeasuredHeight();}ViewGroup.LayoutParams params = LayoutParams();params.height = totalHeight + (DividerHeight() * (Count() - 1));listView.setLayoutParams(params);}
ImageView imageView = new ImageView(getActivity());//父控件是LinearLayoutLinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);//相当于android:layout_gravity属性 avity = Gravity.CENTER_VERTICAL;imageView.setLayoutParams(params);imageView.setScaleType(ImageView.ScaleType.FIT_XY);Button button = new Button(getActivity());LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);button.setLayoutParams(params);//相当于android:gravity属性 button.setGravity(Gravity.CENTER_VERTICAL);linearLayout.addView(imageView);linearLayout.addView(button);
// %1表示第一个位置,$d表示数字,$s表示文本<string name="sale_comment_text1">【%1$d】</string><string name="sale_comment_text2">%1$s评价%2$s</string>getString(R.string.sale_comment_CommentType())getString(R.string.sale_comment_CustomerName(),SalesName())// 拼接文本为:【2】,张三评价李四
textAppearanceInverse/
textAppearanceLarge/
textAppearanceLargeInverse/
textAppearanceMedium/
textAppearanceSmallInverse/
textAppearanceMediumInverse/
textAppearanceSmall/
代码中加下划线
Paint().setFlags(Paint. UNDERLINE_TEXT_FLAG ); //下划线
Paint().setAntiAlias(true);//抗锯齿
转:.html
ext{compileLibVersion = '23.3.0'
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])testCompile 'junit:junit:4.12'compile "com.android.support:appcompat-v7:[$compileLibVersion]"
}
//隐藏掉整个ActionBar,包括下面的Tabs getSupportActionBar().hide();//或requestWindowFeature(Window.FEATURE_NO_TITLE); //会保留tab标签//高版本可以换成 ActionBar actionBar = getActionBar(); ActionBar actionBar = getSupportActionBar();actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowHomeEnabled(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {Window window = getWindow();// Translucent status barwindow.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}
一行代码解决Android M新的运行时权限问题:
本文发布于:2024-02-05 01:24:59,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170720880061775.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |