Commit e6d72fa4 by 郑鹏

更改餐馆评论的图片选择方式

parent eb844dc5
/*apply plugin: 'com.android.application'*/ apply plugin: 'com.android.application'
apply plugin: 'com.android.library' /*apply plugin: 'com.android.library'
apply plugin: 'maven' apply plugin: 'maven'*/
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-kapt'
...@@ -16,8 +16,8 @@ android { ...@@ -16,8 +16,8 @@ android {
compileSdkVersion 30 compileSdkVersion 30
defaultConfig { defaultConfig {
/* multiDexEnabled true multiDexEnabled true
applicationId "com.mhq.smartorder"*/ applicationId "com.mhq.smartorder"
minSdkVersion 26 minSdkVersion 26
targetSdkVersion 30 targetSdkVersion 30
...@@ -35,13 +35,13 @@ android { ...@@ -35,13 +35,13 @@ android {
abiFilters "armeabi-v7a", "armeabi", "x86" abiFilters "armeabi-v7a", "armeabi", "x86"
} }
manifestPlaceholders = [ manifestPlaceholders = [
MTA_APPKEY:"AIAF8SC17A3L", MTA_APPKEY : "AIAF8SC17A3L",
MTA_CHANNEL:"GooglePay" MTA_CHANNEL: "GooglePay"
//极光推送 //极光推送
/* JPUSH_PKGNAME: applicationId, /* JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "xx", //JPush上注册的包名对应的appkey. JPUSH_APPKEY : "xx", //JPush上注册的包名对应的appkey.
JPUSH_CHANNEL: "xx-default", //暂时填写默认值即可.*/ JPUSH_CHANNEL: "xx-default", //暂时填写默认值即可.*/
] ]
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
...@@ -53,23 +53,23 @@ android { ...@@ -53,23 +53,23 @@ android {
timeOutInMs=5*1000 timeOutInMs=5*1000
installOptions '-r','-s' installOptions '-r','-s'
} }
*/ */
/* signingConfigs {
/*signingConfigs {
def appStoreFilePath = System.getProperty('StoreFilePath') def appStoreFilePath = System.getProperty('StoreFilePath')
def appStorePassword = System.getProperty('StorePassword') def appStorePassword = System.getProperty('StorePassword')
def appKeyAlias = System.getProperty('KeyAlias') def appKeyAlias = System.getProperty('KeyAlias')
def appKeyPassword = System.getProperty('KeyPassword') def appKeyPassword = System.getProperty('KeyPassword')
Properties properties = new Properties() Properties properties = new Properties()
if (rootProject.file("local.properties").exists()) { if (rootProject.file("local.properties").exists()) {
properties.load(rootProject.file("local.properties").newDataInputStream()) properties.load(rootProject.file("local.properties").newDataInputStream())
storeFilePath= properties.get("STOREFILE") storeFilePath = properties.get("STOREFILE")
storePassword= properties.get("STOREPASSWORD") storePassword = properties.get("STOREPASSWORD")
keyAlias= properties.get("KEYALIAS") keyAlias = properties.get("KEYALIAS")
keyPassword= properties.get("KEYPASSWORD") keyPassword = properties.get("KEYPASSWORD")
} }
if (!appStoreFilePath || !appStorePassword || !appKeyAlias || !appKeyPassword) { if (!appStoreFilePath || !appStorePassword || !appKeyAlias || !appKeyPassword) {
//将.android下的debug.keystore放到app目录下 //将.android下的debug.keystore放到app目录下
...@@ -90,7 +90,7 @@ android { ...@@ -90,7 +90,7 @@ android {
}*/ }*/
/* buildTypes { /* buildTypes {
debug { debug {
// buildConfigField 'String','NAME','value' // buildConfigField 'String','NAME','value'
zipAlignEnabled true zipAlignEnabled true
...@@ -114,6 +114,8 @@ android { ...@@ -114,6 +114,8 @@ android {
} }
}*/ }*/
sourceSets.main { sourceSets.main {
jniLibs.srcDirs = ['libs'] jniLibs.srcDirs = ['libs']
java.srcDirs += 'src/support/java' java.srcDirs += 'src/support/java'
...@@ -127,7 +129,7 @@ android { ...@@ -127,7 +129,7 @@ android {
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
/* //DomainObjectCollection集合 //DomainObjectCollection集合
applicationVariants.all { variant -> applicationVariants.all { variant ->
variant.outputs.each { output -> variant.outputs.each { output ->
if (output.outputFile != null && output.outputFile.name.endsWith('.apk') if (output.outputFile != null && output.outputFile.name.endsWith('.apk')
...@@ -143,8 +145,9 @@ android { ...@@ -143,8 +145,9 @@ android {
// output.outputFile=apkFile // output.outputFile=apkFile
} }
} }
}*/ }
} }
def buildTime() { def buildTime() {
def date = new Date(); def date = new Date();
def formattedDate = date.format("yyyyMMdd"); def formattedDate = date.format("yyyyMMdd");
...@@ -169,7 +172,9 @@ def getAppVersionCode() { ...@@ -169,7 +172,9 @@ def getAppVersionCode() {
} }
return stout.toString().split("\n").size() return stout.toString().split("\n").size()
} }
ext {
/*ext {
GITHUB_REPO_PATH = "../../androidlibrary" GITHUB_REPO_PATH = "../../androidlibrary"
PUBLISH_GROUP_ID = 'com.mhq.smartorder' PUBLISH_GROUP_ID = 'com.mhq.smartorder'
PUBLISH_ARTIFACT_ID = 'smartorder' PUBLISH_ARTIFACT_ID = 'smartorder'
...@@ -186,7 +191,11 @@ uploadArchives { ...@@ -186,7 +191,11 @@ uploadArchives {
pom.version = project.PUBLISH_VERSION // 版本号 pom.version = project.PUBLISH_VERSION // 版本号
} }
} }
} }*/
dependencies { dependencies {
...@@ -212,9 +221,9 @@ dependencies { ...@@ -212,9 +221,9 @@ dependencies {
api 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar' api 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
//api 'com.github.bumptech.glide:glide:4.7.1' //api 'com.github.bumptech.glide:glide:4.7.1'
// api 'com.github.bumptech.glide:okhttp3-integration:4.7.1' // api 'com.github.bumptech.glide:okhttp3-integration:4.7.1'
/* annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1' /* annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
kapt 'com.github.bumptech.glide:compiler:4.7.1'*/ kapt 'com.github.bumptech.glide:compiler:4.7.1'*/
api 'com.github.chrisbanes.photoview:library:1.2.4' api 'com.github.chrisbanes.photoview:library:1.2.4'
//api 'com.jakewharton:butterknife:8.4.0' //api 'com.jakewharton:butterknife:8.4.0'
...@@ -230,8 +239,8 @@ dependencies { ...@@ -230,8 +239,8 @@ dependencies {
//kapt deps.butterknife.butterknife_compiler //kapt deps.butterknife.butterknife_compiler
kapt 'com.alibaba:arouter-compiler:1.1.4' kapt 'com.alibaba:arouter-compiler:1.1.4'
/* api 'com.qq.mta:mta:3.4.7-release' /* api 'com.qq.mta:mta:3.4.7-release'
api 'com.tencent.mid:mid:4.06-release'*/ api 'com.tencent.mid:mid:4.06-release'*/
// api project(':component-easeui') // api project(':component-easeui')
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+' api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
implementation 'org.aspectj:aspectjrt:1.8.9' implementation 'org.aspectj:aspectjrt:1.8.9'
...@@ -251,13 +260,13 @@ dependencies { ...@@ -251,13 +260,13 @@ dependencies {
//api 'com.google.android.gms:play-services-wallet:16.0.1' //api 'com.google.android.gms:play-services-wallet:16.0.1'
api 'com.tencent.qcloud:cosxml:5.4.25' api 'com.tencent.qcloud:cosxml:5.4.25'
api 'com.sunfusheng:marqueeview:1.3.3' api 'com.sunfusheng:marqueeview:1.3.3'
/* api 'com.google.firebase:firebase-core:16.0.8' /* api 'com.google.firebase:firebase-core:16.0.8'
api 'com.google.firebase:firebase-messaging:17.6.0'*/ api 'com.google.firebase:firebase-messaging:17.6.0'*/
/* api 'com.tencent.bugly:crashreport:latest.release' /* api 'com.tencent.bugly:crashreport:latest.release'
api 'com.tencent.bugly:nativecrashreport:latest.release'*/ api 'com.tencent.bugly:nativecrashreport:latest.release'*/
//MTA主包 //MTA主包
/* api 'com.qq.mta:mta:3.4.7-Release' /* api 'com.qq.mta:mta:3.4.7-Release'
api 'com.tencent.mid:mid:4.06-Release'*/ api 'com.tencent.mid:mid:4.06-Release'*/
api 'com.github.liys666666:DoubleClick:V2.0.4' api 'com.github.liys666666:DoubleClick:V2.0.4'
api 'com.readystatesoftware.chuck:library:1.1.0' api 'com.readystatesoftware.chuck:library:1.1.0'
......
...@@ -29,7 +29,10 @@ ...@@ -29,7 +29,10 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity android:name=".ui.home.FoodAllEvaluateActivity"></activity> <activity android:name=".ui.home.FoodAllEvaluateActivity"
android:screenOrientation="portrait" >
</activity>
<activity <activity
android:name=".ui.home.HomeActivity" android:name=".ui.home.HomeActivity"
android:configChanges="locale" android:configChanges="locale"
...@@ -132,7 +135,23 @@ ...@@ -132,7 +135,23 @@
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name=".ui.personal.order.food.FoodEvaluationActivity" android:name=".ui.personal.order.food.FoodEvaluationActivity"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.genericFile.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
<activity <activity
android:name=".ui.shop.MallSearchActivity" android:name=".ui.shop.MallSearchActivity"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
......
...@@ -17,6 +17,7 @@ import org.litepal.LitePal; ...@@ -17,6 +17,7 @@ import org.litepal.LitePal;
import java.util.Locale; import java.util.Locale;
import cn.dankal.basiclib.image.Utils;
import cn.dankal.basiclib.util.AppUtils; import cn.dankal.basiclib.util.AppUtils;
import cn.dankal.basiclib.util.DensityAdaptationUtils; import cn.dankal.basiclib.util.DensityAdaptationUtils;
import cn.dankal.basiclib.util.StringUtil; import cn.dankal.basiclib.util.StringUtil;
...@@ -55,6 +56,8 @@ public class ModooApplication extends Application { ...@@ -55,6 +56,8 @@ public class ModooApplication extends Application {
//데이터베이스 초기 화 스 캔 //데이터베이스 초기 화 스 캔
LitePal.initialize(this); LitePal.initialize(this);
Utils.mAppContext=this.getApplicationContext();
//bugly //bugly
//CrashReport.initCrashReport(getApplicationContext(), "74a2fc949e", isDev); //CrashReport.initCrashReport(getApplicationContext(), "74a2fc949e", isDev);
...@@ -182,7 +185,6 @@ public class ModooApplication extends Application { ...@@ -182,7 +185,6 @@ public class ModooApplication extends Application {
/** /**
* App 가 현재 암흑 모드 상태 에 있 는 지 판단 * App 가 현재 암흑 모드 상태 에 있 는 지 판단
* *
* @param context 문맥
* @return * @return
*/ */
public static boolean isDarkMode() { public static boolean isDarkMode() {
......
...@@ -25,8 +25,8 @@ public class BaseApi { ...@@ -25,8 +25,8 @@ public class BaseApi {
/*public static final String BASE_URL = isDev ? "https://api-koreadc.dankal.cn/v1/" /*public static final String BASE_URL = isDev ? "https://api-koreadc.dankal.cn/v1/"
: "https://modoo-api.mhqglobal.com/v1/";*/ : "https://modoo-api.mhqglobal.com/v1/";*/
//public static final String BASE_URL = "https://api-koreadc.dankal.cn/v1/"; public static final String BASE_URL = "https://api-koreadc.dankal.cn/v1/";
public static final String BASE_URL = "https://modoo-api.mhqglobal.com/v1/"; //public static final String BASE_URL = "https://modoo-api.mhqglobal.com/v1/";
public static final String BASE_EXPRESS_URL = "https://info.sweettracker.co.kr/"; public static final String BASE_EXPRESS_URL = "https://info.sweettracker.co.kr/";
......
package cn.dankal.basiclib.image;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Parcelable;
import android.provider.Settings;
import com.facebook.stetho.common.LogUtil;
import java.util.ArrayList;
import java.util.List;
public final class AppUtil
{
private static final String TAG = "AppUtil";
private AppUtil()
{
}
public static String getCurrentProcessName()
{
int pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) Utils.mAppContext.getSystemService(
Context.ACTIVITY_SERVICE);
if (mActivityManager != null)
{
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager.getRunningAppProcesses())
{
if (appProcess.pid == pid)
{
return appProcess.processName;
}
}
}
return null;
}
public static Intent shareTextIntent(String text)
{
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sendIntent.putExtra(Intent.EXTRA_TEXT, text);
sendIntent.setType("text/plain");
return sendIntent;
}
public static List<ResolveInfo> getTextReceivers(PackageManager pm)
{
final Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
final List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return resolveInfos;
}
/**
* @return 获取所有的带启动图标的App
*/
public static List<ResolveInfo> getLaunchableResolveInfos()
{
final Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
return Utils.mAppContext.getPackageManager().queryIntentActivities(intent, 0);
}
/**
* 取得版本名称,对应 AndroidManifest.xml 文件 <manifest> 标签下的 versionName 属性
*
* @return 返回版本字符串,比如:1.0
*/
public static String getVersionName()
{
return getDefPackageInfo().versionName;
}
/**
* 取得版本号,对应 AndroidManifest.xml 文件 <manifest> 标签下的 versionCode 属性
*
* @return 返回版本,比如:1
*/
public static int getVersionCode()
{
return getDefPackageInfo().versionCode;
}
public static PackageInfo getDefPackageInfo()
{
PackageManager packageManager = Utils.mAppContext.getPackageManager();
// getPackageName()是你当前类的包名,0代表是获取版本信息
PackageInfo packInfo = null;
try
{
packInfo = packageManager.getPackageInfo(Utils.mAppContext.getPackageName(), 0);
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
return packInfo;
}
public static boolean isAppExist(String packageName)
{
final PackageManager packageManager = Utils.mAppContext.getPackageManager();
// 获取所有已安装程序的包信息
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
for (int i = 0; i < pinfo.size(); i++)
{
if (pinfo.get(i).packageName.equalsIgnoreCase(packageName))
{
return true;
}
}
return false;
}
public static void gotoAppDetailsSettings(Context context, int requestCode)
{
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
if (context instanceof Activity)
{
((Activity) context).startActivityForResult(intent, requestCode);
}
}
public static String getCurProcessName()
{
int pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) Utils.mAppContext.getSystemService(
Context.ACTIVITY_SERVICE);
if (mActivityManager != null)
{
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager.getRunningAppProcesses())
{
if (appProcess.pid == pid)
{
return appProcess.processName;
}
}
}
return null;
}
public static String getAppLabel()
{
PackageManager packageManager = Utils.mAppContext.getPackageManager();
try
{
return packageManager.getApplicationLabel(
packageManager.getApplicationInfo(Utils.mAppContext.getPackageName(),
0)).toString();
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
LogUtil.e(TAG, "getDefPackageInfo: " + e.getMessage());
}
return null;
}
public static boolean startActivityForPackage(Context context, String packageName)
{
final PackageManager pm = context.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(packageName);
if (null != intent)
{
context.startActivity(intent);
return true;
}
return false;
}
/**
* 打开其他的Activity
*
* @param cls 要打开的Activity
*/
public static void startActivity(Context context, Class<?> cls)
{
if (context == null)
{
return;
}
context.startActivity(new Intent(context, cls));
}
/**
* 打开其他的Activity,并附带Object
*
* @param cls 要打开的Activity
* @param value 要附带的Object
*/
// public static void startActivity(Context context, Class<?> cls, String name, Object value)
// {
// Intent intent = new Intent(context, cls);
// intent.putExtra(name, PG.convertParcelable(value));
// context.startActivity(intent);
// }
//
// public static void startActivity(Context context, Class<?> cls, Object value)
// {
// Intent intent = new Intent(context, cls);
// intent.putExtra(Constants.EXTRA_PARCELABLE, PG.convertParcelable(value));
// context.startActivity(intent);
// }
//
// public static void startActivity(Context context, Intent intent, String name, Object value)
// {
// intent.putExtra(name, PG.convertParcelable(value));
// context.startActivity(intent);
// }
public static void startActivity(Context context, Class<?> cls, String name, int value)
{
Intent intent = new Intent(context, cls);
intent.putExtra(name, value);
context.startActivity(intent);
}
public static void startActivity(Context context, Class<?> cls, String name, boolean value)
{
Intent intent = new Intent(context, cls);
intent.putExtra(name, value);
context.startActivity(intent);
}
/**
* 打开其他的Activity,并附带字符串
*
* @param cls 要打开的Activity
* @param name 字符串名称
* @param value 字符串值
*/
public static void startActivity(Context context, Class<?> cls, String name, String value)
{
Intent intent = new Intent(context, cls);
intent.putExtra(name, value);
context.startActivity(intent);
}
public static void startActivityForResult(Activity context, Class<?> cls, int requestCode,
String name, String value)
{
Intent intent = new Intent(context, cls);
intent.putExtra(name, value);
context.startActivityForResult(intent, requestCode);
}
/* public static <T extends BaseActivity> void startActivityWithParcelable(Context context, Class<T> cls,
Parcelable par)
{
Intent intent = new Intent(context, cls);
intent.putExtra(Constants.EXTRA_PARCELABLE, par);
context.startActivity(intent);
}
public static <T extends BaseActivity> void startActivityWithParcelableList(Context context, Class<T> cls,
ArrayList<? extends Parcelable> par)
{
Intent intent = new Intent(context, cls);
intent.putParcelableArrayListExtra(Constants.EXTRA_PARCELABLE_LIST, par);
context.startActivity(intent);
}*/
/**
* 检测 响应某个意图的Activity 是否存在
* @param context
* @param intent
* @return
*/
/* public static boolean isIntentAvailable(Context context, Intent intent)
{
final PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.GET_ACTIVITIES);
return list.size() > 0;
}*/
}
package cn.dankal.basiclib.image;
/**
* Created by imyyq on 2018/3/14.
*/
public final class Constants
{
public static final String EXTRA_PARCELABLE = "EXTRA_PARCELABLE";
public static final String EXTRA_PARCELABLE_LIST = "EXTRA_PARCELABLE_LIST";
public static final String RELEASE = "release";
}
package cn.dankal.basiclib.image;
import java.io.File;
// file和url是互斥的
public class PickPhotoItem
{
private File file;
private String url; // url优先
public PickPhotoItem()
{
}
public PickPhotoItem(String url)
{
this.url = url;
}
public String getUrl()
{
return url;
}
public void setUrl(String url)
{
this.url = url;
file = null;
}
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
url = null;
}
}
package cn.dankal.basiclib.image;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Build;
import android.view.View;
import com.alibaba.fastjson.JSON;
import com.facebook.stetho.common.LogUtil;
import java.util.Collection;
import java.util.List;
import cn.dankal.client.BuildConfig;
public final class Utils
{
private static final String TAG = "Utils";
public static Context mAppContext;
public static final boolean isRelease;
static
{
isRelease = Constants.RELEASE.equals(BuildConfig.BUILD_TYPE);
}
public static <E> boolean isEmpty(Collection<E> e)
{
return e == null || e.isEmpty();
}
public static String getStackTrace()
{
StackTraceElement[] stackTraceElements = (new Throwable()).getStackTrace();
if (stackTraceElements != null && stackTraceElements.length != 0)
{
StringBuilder builder = new StringBuilder();
for (int i = stackTraceElements.length - 1; i >= 0; i--)
{
StackTraceElement stackTraceElement = stackTraceElements[i];
builder.append("fileName=").append(stackTraceElement.getFileName());
builder.append("\n");
builder.append("info=").append(stackTraceElement.getClassName()).append(
" - ").append(stackTraceElement.getMethodName());
builder.append("\n");
builder.append("\n");
}
return builder.toString();
}
return "getStackTrace";
}
/**
* 取得Json解析的结果
*
* @param jsonString Json格式的字符串
* @param classT 相应的JavaBean类
* @return 返回相应的JavaBean类实例,解析失败,返回null,是控制台上输出出错结果,不是Log
*/
public static <T> T getJsonParseResult(String jsonString, Class<T> classT)
{
T t = null;
try
{
t = JSON.parseObject(jsonString, classT);
}
catch (Exception e)
{
LogUtil.e(TAG, "###JSON解析出错,类名:" + classT.getName() + "###,字符串是:" + jsonString);
e.printStackTrace();
}
return t;
}
/**
* @return JSON数组解析
*/
public static <T> List<T> getJsonParseArrayResult(String jsonString, Class<T> classT)
{
List<T> t = null;
try
{
t = JSON.parseArray(jsonString, classT);
}
catch (Exception e)
{
LogUtil.e(TAG, "###JSON数组解析出错,类名:" + classT.getName() + "###,字符串是:" + jsonString);
e.printStackTrace();
}
return t;
}
public static boolean isNeedCheckPermission()
{
return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1;
}
// 头部补0
public static String headReplenishZero(String src, int targetLen)
{
if (src.length() >= targetLen)
{
return src;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < targetLen - src.length(); i++)
{
builder.append("0");
}
builder.append(src);
return builder.toString();
}
// 尾部补0
public static String tailReplenishZero(String src, int targetLen)
{
int len = src.length();
if (len == targetLen)
{
return src;
}
for (int i = 0; i < targetLen - len; i++)
{
src = src.concat("0");
}
return src;
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(float dpValue)
{
return (int) (dpValue * Utils.mAppContext.getResources().getDisplayMetrics().density + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(float pxValue)
{
return (int) (pxValue / Utils.mAppContext.getResources().getDisplayMetrics().density + 0.5f);
}
public static int[] measureView(View view)
{
int[] arr = new int[2];
int spec = View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED,
View.MeasureSpec.UNSPECIFIED);
view.measure(spec, spec);
arr[0] = view.getMeasuredWidth();
arr[1] = view.getMeasuredHeight();
return arr;
}
/**
* 判断服务是否启动, 注意只要名称相同, 会检测任何服务.
*
* @param context 上下文
* @param serviceClass 服务类
* @return 是否启动服务
*/
public static boolean isServiceRunning(Context context, Class<?> serviceClass)
{
if (context == null)
{
return false;
}
Context appContext = context.getApplicationContext();
ActivityManager manager = (ActivityManager) appContext.getSystemService(
Context.ACTIVITY_SERVICE);
if (manager != null)
{
List<ActivityManager.RunningServiceInfo> infos = manager.getRunningServices(
Integer.MAX_VALUE);
if (infos != null && !infos.isEmpty())
{
for (ActivityManager.RunningServiceInfo service : infos)
{
// 添加Uid验证, 防止服务重名, 当前服务无法启动
if (getUid(context) == service.uid)
{
if (serviceClass.getName().equals(service.service.getClassName()))
{
return true;
}
}
}
}
}
return false;
}
/**
* 获取应用的Uid, 用于验证服务是否启动
*
* @param context 上下文
* @return uid
*/
public static int getUid(Context context)
{
if (context == null)
{
return -1;
}
int pid = android.os.Process.myPid();
ActivityManager manager = (ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
if (manager != null)
{
List<ActivityManager.RunningAppProcessInfo> infos = manager.getRunningAppProcesses();
if (infos != null && !infos.isEmpty())
{
for (ActivityManager.RunningAppProcessInfo processInfo : infos)
{
if (processInfo.pid == pid)
{
return processInfo.uid;
}
}
}
}
return -1;
}
}
package cn.dankal.client.adapter.shop;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.sdk.glide.Glide;
import com.sdk.glide.load.engine.DiskCacheStrategy;
import com.sdk.glide.request.RequestOptions;
import java.util.ArrayList;
import java.util.List;
import cn.dankal.basiclib.ModooApplication;
import cn.dankal.client.R;
/**
* Created by zhengpeng on 2019/5/13.
*/
public class GridImageNewAdapter extends
RecyclerView.Adapter<GridImageNewAdapter.ViewHolder> {
public static final int TYPE_CAMERA = 1;
public static final int TYPE_PICTURE = 2;
private LayoutInflater mInflater;
private List<String> list = new ArrayList<>();
private int selectMax = 9;
private Context context;
/**
* 클릭 하여 이미지 전송 추가
*/
private onAddPicClickListener mOnAddPicClickListener;
public interface onAddPicClickListener {
void onAddPicClick();
void onDelete();
}
public GridImageNewAdapter(Context context, onAddPicClickListener mOnAddPicClickListener) {
this.context = context;
mInflater = LayoutInflater.from(context);
this.mOnAddPicClickListener = mOnAddPicClickListener;
}
public void setSelectMax(int selectMax) {
this.selectMax = selectMax;
}
public void setList(List<String> list) {
this.list = list;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView mImg;
LinearLayout ll_del;
TextView tv_duration;
TextView tvTip;
public ViewHolder(View view) {
super(view);
mImg = (ImageView) view.findViewById(R.id.fiv);
ll_del = (LinearLayout) view.findViewById(R.id.ll_del);
tv_duration = (TextView) view.findViewById(R.id.tv_duration);
tvTip = view.findViewById(R.id.tv_tip_text);
}
}
@Override
public int getItemCount() {
if (list.size() < selectMax) {
return list.size() + 1;
} else {
return list.size();
}
}
@Override
public int getItemViewType(int position) {
if (isShowAddItem(position)) {
return TYPE_CAMERA;
} else {
return TYPE_PICTURE;
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = mInflater.inflate(R.layout.gv_filter_image,
viewGroup, false);
final ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
private boolean isShowAddItem(int position) {
int size = list.size() == 0 ? 0 : list.size();
return position == size;
}
/**
* 설정 값
*/
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
//8 장 미 만, 추가 아이콘 보이 기
if (getItemViewType(position) == TYPE_CAMERA) {
if (ModooApplication.isDarkMode()){
viewHolder.mImg.setImageResource(R.mipmap.ic_evaluation_increase);
}else {
viewHolder.mImg.setImageResource(R.mipmap.ic_evaluation_increase_s);
}
viewHolder.mImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnAddPicClickListener.onAddPicClick();
}
});
viewHolder.ll_del.setVisibility(View.INVISIBLE);
viewHolder.tvTip.setVisibility(View.VISIBLE);
} else {
viewHolder.tvTip.setVisibility(View.GONE);
viewHolder.ll_del.setVisibility(View.VISIBLE);
viewHolder.ll_del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int index = viewHolder.getAdapterPosition();
//여 기 는 가끔 - 1 로 데이터 가 아래로 넘 어 갈 수 있 습 니 다. 구체 적 으로 getAdapterPosition () 소스 코드 를 참고 하 십시오.
if (index != RecyclerView.NO_POSITION) {
list.remove(index);
mOnAddPicClickListener.onDelete();
notifyItemRemoved(index);
notifyItemRangeChanged(index, list.size());
}
}
});
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.color.white)
.diskCacheStrategy(DiskCacheStrategy.ALL);
Glide.with(viewHolder.itemView.getContext())
.load(list.get(position))
.apply(options)
.into(viewHolder.mImg);
// }
if (mItemClickListener != null) {
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int adapterPosition = viewHolder.getAdapterPosition();
mItemClickListener.onItemClick(adapterPosition, v);
}
});
}
}
}
protected OnItemClickListener mItemClickListener;
public interface OnItemClickListener {
void onItemClick(int position, View v);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mItemClickListener = listener;
}
}
...@@ -2,57 +2,46 @@ package cn.dankal.client.ui.personal.order.food ...@@ -2,57 +2,46 @@ package cn.dankal.client.ui.personal.order.food
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.graphics.Paint import android.support.design.widget.BottomSheetDialog
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.content.ContextCompat import android.support.v4.content.ContextCompat
import android.support.v7.widget.AppCompatButton
import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.GridLayoutManager
import android.text.Editable import android.text.Editable
import android.text.TextUtils import android.text.TextUtils
import android.text.TextWatcher import android.text.TextWatcher
import android.util.Log
import android.view.LayoutInflater
import android.view.View import android.view.View
import cn.dankal.basiclib.api.RestaurantServiceFactory import cn.dankal.basiclib.api.RestaurantServiceFactory
import cn.dankal.basiclib.api.UserServiceFactory import cn.dankal.basiclib.api.UserServiceFactory
import cn.dankal.basiclib.base.activity.BaseActivity import cn.dankal.basiclib.base.activity.BaseActivity
import cn.dankal.basiclib.base.activity.BigPhotoActivity
import cn.dankal.basiclib.base.callback.DKCallBackBoolean import cn.dankal.basiclib.base.callback.DKCallBackBoolean
import cn.dankal.basiclib.base.fragmentactivity.FragmentAdapter
import cn.dankal.basiclib.cos.CosUploadUtil import cn.dankal.basiclib.cos.CosUploadUtil
import cn.dankal.basiclib.image.CaptureAndCropManager
import cn.dankal.basiclib.rx.AbstractDialogSubscriber import cn.dankal.basiclib.rx.AbstractDialogSubscriber
import cn.dankal.basiclib.util.ButtonUtil
import cn.dankal.basiclib.util.ToastUtils import cn.dankal.basiclib.util.ToastUtils
import cn.dankal.basiclib.util.WebViewUtil
import cn.dankal.basiclib.util.image.PicUtils import cn.dankal.basiclib.util.image.PicUtils
import cn.dankal.basiclib.widget.FullyGridLayoutManager import cn.dankal.basiclib.widget.FullyGridLayoutManager
import cn.dankal.entities.home.EvaluationCommitEntity
import cn.dankal.entities.personal.OrderHotelDetail
import cn.dankal.client.R import cn.dankal.client.R
import cn.dankal.client.adapter.shop.GridImageAdapter import cn.dankal.client.adapter.shop.GridImageNewAdapter
import cn.dankal.client.constants.ConstantsShopType import cn.dankal.entities.home.EvaluationCommitEntity
import cn.dankal.client.ui.shop.DetailsMerchantFragment
import cn.dankal.client.ui.shop.MerchantInfoFragment
import cn.dankal.client.util.UIUtile
import cn.dankal.entities.home.RestaurantDetailEntity import cn.dankal.entities.home.RestaurantDetailEntity
import cn.dankal.entities.shop.MerchantHomeEntity import cn.dankal.entities.personal.OrderHotelDetail
import cn.dankal.entities.shop.ShopDetailEntity
import com.luck.picture.lib.PictureSelector
import com.luck.picture.lib.config.PictureConfig
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.entity.LocalMedia
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import kotlinx.android.synthetic.main.activity_food_evaluation.* import kotlinx.android.synthetic.main.activity_food_evaluation.*
import kotlinx.android.synthetic.main.activity_merchant_home.*
import okhttp3.ResponseBody import okhttp3.ResponseBody
import java.io.Serializable
/** /**
* 식당 평가 * 식당 평가
*/ */
class FoodEvaluationActivity : BaseActivity(), GridImageAdapter.onAddPicClickListener, View.OnClickListener { class FoodEvaluationActivity : BaseActivity(), GridImageNewAdapter.onAddPicClickListener, View.OnClickListener {
private var listImage = mutableListOf<String>()//제출 해 야 할 댓 글 사진, 텐 센트 클 라 우 드 에 올 려 주세요. private var listImage = mutableListOf<String>()//제출 해 야 할 댓 글 사진, 텐 센트 클 라 우 드 에 올 려 주세요.
private var commitListImage = mutableListOf<String>()//매개 변수 로 올 린 이미지 private var commitListImage = mutableListOf<String>()//매개 변수 로 올 린 이미지
private lateinit var mBottomDialog: BottomSheetDialog
override fun onClick(v: View?) { override fun onClick(v: View?) {
var content = et_feedback.text.toString().trim() var content = et_feedback.text.toString().trim()
...@@ -110,32 +99,16 @@ class FoodEvaluationActivity : BaseActivity(), GridImageAdapter.onAddPicClickLis ...@@ -110,32 +99,16 @@ class FoodEvaluationActivity : BaseActivity(), GridImageAdapter.onAddPicClickLis
}) })
} }
private var adapter: GridImageAdapter? = null private var adapter: GridImageNewAdapter? = null
private var selectList: List<LocalMedia> = ArrayList<LocalMedia>() private var selectList: List<LocalMedia> = ArrayList<LocalMedia>()
private var themeId = R.style.picture_default_style private var themeId = R.style.picture_default_style
private var orderId: String? = "" private var orderId: String? = ""
override fun onDelete() {
tv_img_count.text = "(${listImage.size}/6)"
}
override fun onAddPicClick() { override fun onAddPicClick() {
PictureSelector.create(this@FoodEvaluationActivity) mBottomDialog.show()
.openGallery(PictureMimeType.ofImage())
.theme(themeId)
.maxSelectNum(6)
.minSelectNum(1)
.imageSpanCount(4)
.selectionMode(PictureConfig.MULTIPLE)
.previewImage(true)
.isCamera(true)
.isZoomAnim(true)
//.imageFormat(PictureMimeType.PNG)
//.setOutputCameraPath("/CustomPath")
.enableCrop(false)
.compress(true)
.synOrAsy(true)
.glideOverride(160, 160)
.freeStyleCropEnabled(true)
.selectionMedia(selectList)
.minimumCompressSize(100)
.forResult(PictureConfig.CHOOSE_REQUEST)
} }
override fun getLayoutId(): Int { override fun getLayoutId(): Int {
...@@ -171,10 +144,29 @@ class FoodEvaluationActivity : BaseActivity(), GridImageAdapter.onAddPicClickLis ...@@ -171,10 +144,29 @@ class FoodEvaluationActivity : BaseActivity(), GridImageAdapter.onAddPicClickLis
tv_btn_commit.setOnClickListener(this) tv_btn_commit.setOnClickListener(this)
mBottomDialog = BottomSheetDialog(this)
val bottomView = LayoutInflater.from(this).inflate(R.layout.dialog_photo_picker, null)
bottomView.findViewById<AppCompatButton>(R.id.photodialog_btn_take).setOnClickListener {
CaptureAndCropManager.capturePhotoFromCamera(this,
CaptureAndCropManager.REQUEST_CODE_CAPTURE)
mBottomDialog.dismiss()
}
bottomView.findViewById<AppCompatButton>(R.id.photodialog_btn_native).setOnClickListener {
CaptureAndCropManager.capturePhotoFromGallery(this,
CaptureAndCropManager.REQUEST_CODE_ALBUM)
mBottomDialog.dismiss()
}
bottomView.findViewById<AppCompatButton>(R.id.photodialog_btn_cancel).setOnClickListener {
mBottomDialog.dismiss()
}
mBottomDialog.setContentView(bottomView)
val manager = FullyGridLayoutManager(this@FoodEvaluationActivity, 4, GridLayoutManager.VERTICAL, false) val manager = FullyGridLayoutManager(this@FoodEvaluationActivity, 4, GridLayoutManager.VERTICAL, false)
rv_add_picture.layoutManager = manager rv_add_picture.layoutManager = manager
adapter = GridImageAdapter(this, this) adapter = GridImageNewAdapter(this, this)
rv_add_picture.adapter = adapter rv_add_picture.adapter = adapter
} }
/** /**
...@@ -202,53 +194,36 @@ class FoodEvaluationActivity : BaseActivity(), GridImageAdapter.onAddPicClickLis ...@@ -202,53 +194,36 @@ class FoodEvaluationActivity : BaseActivity(), GridImageAdapter.onAddPicClickLis
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
when (requestCode) { when (requestCode) {
PictureConfig.CHOOSE_REQUEST -> { CaptureAndCropManager.REQUEST_CODE_CAPTURE -> {
if (data == null) { CaptureAndCropManager.cropPhotoAfterCapture(this,
return CaptureAndCropManager.REQUEST_CODE_CROP)
} }
// 이미지 선택 결과 반전 CaptureAndCropManager.REQUEST_CODE_ALBUM -> if (data != null && data.data != null) {
selectList = PictureSelector.obtainMultipleResult(data)
CaptureAndCropManager.cropPhotoFromUri(this, data.data,
if (selectList != null) { CaptureAndCropManager.REQUEST_CODE_CROP)
}
tv_img_count.text = "上传图片(${selectList.size}/6)" CaptureAndCropManager.REQUEST_CODE_CROP -> {
if (data != null) {
listImage.clear() val file = CaptureAndCropManager.getLastCropImageFile()
commitListImage.clear() var path = file.path
listImage.add(path)
for (i in 0 until selectList.size) { val avatar = path.substring(path.lastIndexOf("/") + 1)
val media = selectList.get(i) commitListImage.add(avatar)
var path = ""
path = if (media.isCut && !media.isCompressed) { tv_img_count.text = "(${listImage.size}/6)"
// 재단 한 적 이 있다
media.cutPath adapter?.let {
} else if (media.isCompressed || media.isCut && media.isCompressed) { it.setList(listImage)
// 압축 한 적 이 있 거나, 재단 과 동시에 압축 한 적 이 있 으 며, 최종 적 으로 그림 을 압축 한 적 이 있 는 것 을 기준 으로 한다. it.notifyDataSetChanged()
media.compressPath
} else {
// 원 도
media.path
}
if (path == "") {
return
}
listImage.add(path)
val avatar = path.substring(path.lastIndexOf("/") + 1)
commitListImage.add(avatar)
} }
} }
adapter?.let {
it.setList(selectList)
it.notifyDataSetChanged()
}
} }
} }
} }
} }
} }
package com.zhy.adapter.recyclerview;
import android.content.Context;
import android.view.LayoutInflater;
import com.zhy.adapter.recyclerview.base.ItemViewDelegate;
import com.zhy.adapter.recyclerview.base.ViewHolder;
import java.util.List;
/**
* Created by zhy on 16/4/9.
*/
public abstract class CommonAdapter<T> extends MultiItemTypeAdapter<T>
{
protected Context mContext;
protected int mLayoutId;
protected List<T> mDatas;
protected LayoutInflater mInflater;
public CommonAdapter(final Context context, final int layoutId, List<T> datas)
{
super(context, datas);
mContext = context;
mInflater = LayoutInflater.from(context);
mLayoutId = layoutId;
mDatas = datas;
addItemViewDelegate(new ItemViewDelegate<T>()
{
@Override
public int getItemViewLayoutId()
{
return layoutId;
}
@Override
public boolean isForViewType( T item, int position)
{
return true;
}
@Override
public void convert(ViewHolder holder, T t, int position)
{
CommonAdapter.this.convert(holder, t, position);
}
});
}
protected abstract void convert(ViewHolder holder, T t, int position);
}
package com.zhy.adapter.recyclerview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.zhy.adapter.recyclerview.base.ItemViewDelegate;
import com.zhy.adapter.recyclerview.base.ItemViewDelegateManager;
import com.zhy.adapter.recyclerview.base.ViewHolder;
import java.util.List;
import cn.dankal.client.R;
/**
* Created by zhy on 16/4/9.
*/
public class MultiItemTypeAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
protected Context mContext;
protected List<T> mDatas;
protected ItemViewDelegateManager mItemViewDelegateManager;
protected OnItemClickListener mOnItemClickListener;
private View.OnClickListener mOnClickListener;
private View.OnLongClickListener mOnLongClickListener;
public MultiItemTypeAdapter(Context context, List<T> datas) {
mContext = context;
mDatas = datas;
mItemViewDelegateManager = new ItemViewDelegateManager();
mOnClickListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mOnItemClickListener != null) {
int position = (int) v.getTag(R.id.tag_for_position);
RecyclerView.ViewHolder viewHolder = (RecyclerView.ViewHolder) v.getTag(
R.id.tag_for_view_holder);
mOnItemClickListener.onItemClick(v, viewHolder, position);
}
}
};
mOnLongClickListener = new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
if (mOnItemClickListener != null) {
int position = (int) v.getTag(R.id.tag_for_position);
RecyclerView.ViewHolder viewHolder = (RecyclerView.ViewHolder) v.getTag(
R.id.tag_for_view_holder);
return mOnItemClickListener.onItemLongClick(v, viewHolder, position);
}
return false;
}
};
}
@Override
public int getItemViewType(int position) {
if (!useItemViewDelegateManager()) return super.getItemViewType(position);
return mItemViewDelegateManager.getItemViewType(mDatas.get(position), position);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(
@NonNull
ViewGroup parent, int viewType) {
ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType);
int layoutId = itemViewDelegate.getItemViewLayoutId();
ViewHolder holder = ViewHolder.createViewHolder(mContext, parent, layoutId);
onViewHolderCreated(holder,holder.getConvertView());
holder.getConvertView().setTag(R.id.tag_for_view_type, viewType);
return holder;
}
public void onViewHolderCreated(ViewHolder holder, View itemView){
}
public void convert(ViewHolder holder, T t) {
mItemViewDelegateManager.convert(holder, t, holder.getAdapterPosition());
}
protected boolean isEnabled(int viewType) {
return true;
}
@Override
public void onBindViewHolder(
@NonNull
ViewHolder holder, int position) {
View convertView = holder.getConvertView();
int viewType = (int) convertView.getTag(R.id.tag_for_view_type);
if (isEnabled(viewType))
{
convertView.setTag(R.id.tag_for_position, position);
convertView.setTag(R.id.tag_for_view_holder, holder);
convertView.setOnClickListener(mOnClickListener);
convertView.setOnLongClickListener(mOnLongClickListener);
}
else
{
convertView.setOnClickListener(null);
convertView.setOnLongClickListener(null);
}
convert(holder, mDatas.get(position));
}
@Override
public int getItemCount() {
int itemCount = mDatas.size();
return itemCount;
}
public List<T> getDatas() {
return mDatas;
}
public MultiItemTypeAdapter addItemViewDelegate(ItemViewDelegate<T> itemViewDelegate) {
mItemViewDelegateManager.addDelegate(itemViewDelegate);
return this;
}
public MultiItemTypeAdapter addItemViewDelegate(int viewType, ItemViewDelegate<T> itemViewDelegate) {
mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate);
return this;
}
protected boolean useItemViewDelegateManager() {
return mItemViewDelegateManager.getItemViewDelegateCount() > 0;
}
public interface OnItemClickListener {
void onItemClick(View view, RecyclerView.ViewHolder holder, int position);
boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}
}
package com.zhy.adapter.recyclerview.base;
/**
* Created by zhy on 16/6/22.
*/
public interface ItemViewDelegate<T>
{
int getItemViewLayoutId();
boolean isForViewType(T item, int position);
void convert(ViewHolder holder, T t, int position);
}
package com.zhy.adapter.recyclerview.base;
import android.support.v4.util.SparseArrayCompat;
/**
* Created by zhy on 16/6/22.
*/
public class ItemViewDelegateManager<T>
{
SparseArrayCompat<ItemViewDelegate<T>> delegates = new SparseArrayCompat<>();
public int getItemViewDelegateCount()
{
return delegates.size();
}
public ItemViewDelegateManager<T> addDelegate(ItemViewDelegate<T> delegate)
{
int viewType = delegates.size();
if (delegate != null)
{
delegates.put(viewType, delegate);
viewType++;
}
return this;
}
public ItemViewDelegateManager<T> addDelegate(int viewType, ItemViewDelegate<T> delegate)
{
if (delegates.get(viewType) != null)
{
throw new IllegalArgumentException(
"An ItemViewDelegate is already registered for the viewType = "
+ viewType
+ ". Already registered ItemViewDelegate is "
+ delegates.get(viewType));
}
delegates.put(viewType, delegate);
return this;
}
public ItemViewDelegateManager<T> removeDelegate(ItemViewDelegate<T> delegate)
{
if (delegate == null)
{
throw new NullPointerException("ItemViewDelegate is null");
}
int indexToRemove = delegates.indexOfValue(delegate);
if (indexToRemove >= 0)
{
delegates.removeAt(indexToRemove);
}
return this;
}
public ItemViewDelegateManager<T> removeDelegate(int itemType)
{
int indexToRemove = delegates.indexOfKey(itemType);
if (indexToRemove >= 0)
{
delegates.removeAt(indexToRemove);
}
return this;
}
public int getItemViewType(T item, int position)
{
int delegatesCount = delegates.size();
for (int i = delegatesCount - 1; i >= 0; i--)
{
ItemViewDelegate<T> delegate = delegates.valueAt(i);
if (delegate.isForViewType( item, position))
{
return delegates.keyAt(i);
}
}
throw new IllegalArgumentException(
"No ItemViewDelegate added that matches position=" + position + " in data source");
}
public void convert(ViewHolder holder, T item, int position)
{
int delegatesCount = delegates.size();
for (int i = 0; i < delegatesCount; i++)
{
ItemViewDelegate<T> delegate = delegates.valueAt(i);
if (delegate.isForViewType( item, position))
{
delegate.convert(holder, item, position);
return;
}
}
throw new IllegalArgumentException(
"No ItemViewDelegateManager added that matches position=" + position + " in data source");
}
public ItemViewDelegate getItemViewDelegate(int viewType)
{
return delegates.get(viewType);
}
public int getItemViewLayoutId(int viewType)
{
return getItemViewDelegate(viewType).getItemViewLayoutId();
}
public int getItemViewType(ItemViewDelegate itemViewDelegate)
{
return delegates.indexOfValue(itemViewDelegate);
}
}
package com.zhy.adapter.recyclerview.base;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.widget.RecyclerView;
import android.text.util.Linkify;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;
public class ViewHolder extends RecyclerView.ViewHolder
{
private SparseArray<View> mViews;
private View mConvertView;
private Context mContext;
public ViewHolder(Context context, View itemView)
{
super(itemView);
mContext = context;
mConvertView = itemView;
mViews = new SparseArray<View>();
}
public static ViewHolder createViewHolder(Context context, View itemView)
{
ViewHolder holder = new ViewHolder(context, itemView);
return holder;
}
public static ViewHolder createViewHolder(Context context,
ViewGroup parent, int layoutId)
{
View itemView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
ViewHolder holder = new ViewHolder(context, itemView);
return holder;
}
/**
* 通过viewId获取控件
*
* @param viewId
* @return
*/
public <T extends View> T getView(int viewId)
{
View view = mViews.get(viewId);
if (view == null)
{
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getConvertView()
{
return mConvertView;
}
/****以下为辅助方法*****/
/**
* 设置TextView的值
*
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, String text)
{
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
public ViewHolder setImageResource(int viewId, int resId)
{
ImageView view = getView(viewId);
view.setImageResource(resId);
return this;
}
public ViewHolder setImageBitmap(int viewId, Bitmap bitmap)
{
ImageView view = getView(viewId);
view.setImageBitmap(bitmap);
return this;
}
public ViewHolder setImageDrawable(int viewId, Drawable drawable)
{
ImageView view = getView(viewId);
view.setImageDrawable(drawable);
return this;
}
public ViewHolder setBackgroundColor(int viewId, int color)
{
View view = getView(viewId);
view.setBackgroundColor(color);
return this;
}
public ViewHolder setBackgroundRes(int viewId, int backgroundRes)
{
View view = getView(viewId);
view.setBackgroundResource(backgroundRes);
return this;
}
public ViewHolder setTextColor(int viewId, int textColor)
{
TextView view = getView(viewId);
view.setTextColor(textColor);
return this;
}
public ViewHolder setTextColorRes(int viewId, int textColorRes)
{
TextView view = getView(viewId);
view.setTextColor(mContext.getResources().getColor(textColorRes));
return this;
}
@SuppressLint("NewApi")
public ViewHolder setAlpha(int viewId, float value)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
getView(viewId).setAlpha(value);
} else
{
// Pre-honeycomb hack to set Alpha value
AlphaAnimation alpha = new AlphaAnimation(value, value);
alpha.setDuration(0);
alpha.setFillAfter(true);
getView(viewId).startAnimation(alpha);
}
return this;
}
public ViewHolder setVisible(int viewId, boolean visible)
{
View view = getView(viewId);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
return this;
}
public ViewHolder linkify(int viewId)
{
TextView view = getView(viewId);
Linkify.addLinks(view, Linkify.ALL);
return this;
}
public ViewHolder setTypeface(Typeface typeface, int... viewIds)
{
for (int viewId : viewIds)
{
TextView view = getView(viewId);
view.setTypeface(typeface);
view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
}
return this;
}
public ViewHolder setProgress(int viewId, int progress)
{
ProgressBar view = getView(viewId);
view.setProgress(progress);
return this;
}
public ViewHolder setProgress(int viewId, int progress, int max)
{
ProgressBar view = getView(viewId);
view.setMax(max);
view.setProgress(progress);
return this;
}
public ViewHolder setMax(int viewId, int max)
{
ProgressBar view = getView(viewId);
view.setMax(max);
return this;
}
public ViewHolder setRating(int viewId, float rating)
{
RatingBar view = getView(viewId);
view.setRating(rating);
return this;
}
public ViewHolder setRating(int viewId, float rating, int max)
{
RatingBar view = getView(viewId);
view.setMax(max);
view.setRating(rating);
return this;
}
public ViewHolder setTag(int viewId, Object tag)
{
View view = getView(viewId);
view.setTag(tag);
return this;
}
public ViewHolder setTag(int viewId, int key, Object tag)
{
View view = getView(viewId);
view.setTag(key, tag);
return this;
}
public ViewHolder setChecked(int viewId, boolean checked)
{
Checkable view = (Checkable) getView(viewId);
view.setChecked(checked);
return this;
}
/**
* 关于事件的
*/
public ViewHolder setOnClickListener(int viewId,
View.OnClickListener listener)
{
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
public ViewHolder setOnTouchListener(int viewId,
View.OnTouchListener listener)
{
View view = getView(viewId);
view.setOnTouchListener(listener);
return this;
}
public ViewHolder setOnLongClickListener(int viewId,
View.OnLongClickListener listener)
{
View view = getView(viewId);
view.setOnLongClickListener(listener);
return this;
}
}
package com.zhy.adapter.recyclerview.utils;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.ViewGroup;
/**
* Created by zhy on 16/6/28.
*/
public class WrapperUtils
{
public interface SpanSizeCallback
{
int getSpanSize(GridLayoutManager layoutManager , GridLayoutManager.SpanSizeLookup oldLookup, int position);
}
public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback)
{
innerAdapter.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager)
{
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup()
{
@Override
public int getSpanSize(int position)
{
return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position);
}
});
gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
}
}
public static void setFullSpan(RecyclerView.ViewHolder holder)
{
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if (lp != null
&& lp instanceof StaggeredGridLayoutManager.LayoutParams)
{
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
p.setFullSpan(true);
}
}
}
package com.zhy.adapter.recyclerview.wrapper;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.zhy.adapter.recyclerview.base.ViewHolder;
import com.zhy.adapter.recyclerview.utils.WrapperUtils;
/**
* Created by zhy on 16/6/23.
*/
public class EmptyWrapper<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
public static final int ITEM_TYPE_EMPTY = Integer.MAX_VALUE - 1;
private RecyclerView.Adapter mInnerAdapter;
private View mEmptyView;
private int mEmptyLayoutId;
public EmptyWrapper(RecyclerView.Adapter adapter)
{
mInnerAdapter = adapter;
}
private boolean isEmpty()
{
return (mEmptyView != null || mEmptyLayoutId != 0) && mInnerAdapter.getItemCount() == 0;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
if (isEmpty())
{
ViewHolder holder;
if (mEmptyView != null)
{
holder = ViewHolder.createViewHolder(parent.getContext(), mEmptyView);
} else
{
holder = ViewHolder.createViewHolder(parent.getContext(), parent, mEmptyLayoutId);
}
return holder;
}
return mInnerAdapter.onCreateViewHolder(parent, viewType);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
{
WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback()
{
@Override
public int getSpanSize(GridLayoutManager gridLayoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position)
{
if (isEmpty())
{
return gridLayoutManager.getSpanCount();
}
if (oldLookup != null)
{
return oldLookup.getSpanSize(position);
}
return 1;
}
});
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder)
{
mInnerAdapter.onViewAttachedToWindow(holder);
if (isEmpty())
{
WrapperUtils.setFullSpan(holder);
}
}
@Override
public int getItemViewType(int position)
{
if (isEmpty())
{
return ITEM_TYPE_EMPTY;
}
return mInnerAdapter.getItemViewType(position);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if (isEmpty())
{
return;
}
mInnerAdapter.onBindViewHolder(holder, position);
}
@Override
public int getItemCount()
{
if (isEmpty()) return 1;
return mInnerAdapter.getItemCount();
}
public void setEmptyView(View emptyView)
{
mEmptyView = emptyView;
}
public void setEmptyView(int layoutId)
{
mEmptyLayoutId = layoutId;
}
}
package com.zhy.adapter.recyclerview.wrapper;
import android.support.v4.util.SparseArrayCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.zhy.adapter.recyclerview.base.ViewHolder;
import com.zhy.adapter.recyclerview.utils.WrapperUtils;
/**
* Created by zhy on 16/6/23.
*/
public class HeaderAndFooterWrapper<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
private static final int BASE_ITEM_TYPE_HEADER = 100000;
private static final int BASE_ITEM_TYPE_FOOTER = 200000;
private SparseArrayCompat<View> mHeaderViews = new SparseArrayCompat<>();
private SparseArrayCompat<View> mFootViews = new SparseArrayCompat<>();
private RecyclerView.Adapter mInnerAdapter;
public HeaderAndFooterWrapper(RecyclerView.Adapter adapter)
{
mInnerAdapter = adapter;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
if (mHeaderViews.get(viewType) != null)
{
ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mHeaderViews.get(viewType));
return holder;
} else if (mFootViews.get(viewType) != null)
{
ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mFootViews.get(viewType));
return holder;
}
return mInnerAdapter.onCreateViewHolder(parent, viewType);
}
@Override
public int getItemViewType(int position)
{
if (isHeaderViewPos(position))
{
return mHeaderViews.keyAt(position);
} else if (isFooterViewPos(position))
{
return mFootViews.keyAt(position - getHeadersCount() - getRealItemCount());
}
return mInnerAdapter.getItemViewType(position - getHeadersCount());
}
private int getRealItemCount()
{
return mInnerAdapter.getItemCount();
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if (isHeaderViewPos(position))
{
return;
}
if (isFooterViewPos(position))
{
return;
}
mInnerAdapter.onBindViewHolder(holder, position - getHeadersCount());
}
@Override
public int getItemCount()
{
return getHeadersCount() + getFootersCount() + getRealItemCount();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
{
WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback()
{
@Override
public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position)
{
int viewType = getItemViewType(position);
if (mHeaderViews.get(viewType) != null)
{
return layoutManager.getSpanCount();
} else if (mFootViews.get(viewType) != null)
{
return layoutManager.getSpanCount();
}
if (oldLookup != null)
return oldLookup.getSpanSize(position);
return 1;
}
});
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder)
{
mInnerAdapter.onViewAttachedToWindow(holder);
int position = holder.getLayoutPosition();
if (isHeaderViewPos(position) || isFooterViewPos(position))
{
WrapperUtils.setFullSpan(holder);
}
}
private boolean isHeaderViewPos(int position)
{
return position < getHeadersCount();
}
private boolean isFooterViewPos(int position)
{
return position >= getHeadersCount() + getRealItemCount();
}
public void addHeaderView(View view)
{
mHeaderViews.put(mHeaderViews.size() + BASE_ITEM_TYPE_HEADER, view);
}
public void addFootView(View view)
{
mFootViews.put(mFootViews.size() + BASE_ITEM_TYPE_FOOTER, view);
}
public int getHeadersCount()
{
return mHeaderViews.size();
}
public int getFootersCount()
{
return mFootViews.size();
}
}
package com.zhy.adapter.recyclerview.wrapper;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup;
import com.zhy.adapter.recyclerview.base.ViewHolder;
import com.zhy.adapter.recyclerview.utils.WrapperUtils;
/**
* Created by zhy on 16/6/23.
*/
public class LoadMoreWrapper<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
public static final int ITEM_TYPE_LOAD_MORE = Integer.MAX_VALUE - 2;
private RecyclerView.Adapter mInnerAdapter;
private View mLoadMoreView;
private int mLoadMoreLayoutId;
public LoadMoreWrapper(RecyclerView.Adapter adapter)
{
mInnerAdapter = adapter;
}
private boolean hasLoadMore()
{
return mLoadMoreView != null || mLoadMoreLayoutId != 0;
}
private boolean isShowLoadMore(int position)
{
return hasLoadMore() && (position >= mInnerAdapter.getItemCount());
}
@Override
public int getItemViewType(int position)
{
if (isShowLoadMore(position))
{
return ITEM_TYPE_LOAD_MORE;
}
return mInnerAdapter.getItemViewType(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
if (viewType == ITEM_TYPE_LOAD_MORE)
{
ViewHolder holder;
if (mLoadMoreView != null)
{
holder = ViewHolder.createViewHolder(parent.getContext(), mLoadMoreView);
} else
{
holder = ViewHolder.createViewHolder(parent.getContext(), parent, mLoadMoreLayoutId);
}
return holder;
}
return mInnerAdapter.onCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if (isShowLoadMore(position))
{
if (mOnLoadMoreListener != null)
{
mOnLoadMoreListener.onLoadMoreRequested();
}
return;
}
mInnerAdapter.onBindViewHolder(holder, position);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
{
WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback()
{
@Override
public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position)
{
if (isShowLoadMore(position))
{
return layoutManager.getSpanCount();
}
if (oldLookup != null)
{
return oldLookup.getSpanSize(position);
}
return 1;
}
});
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder)
{
mInnerAdapter.onViewAttachedToWindow(holder);
if (isShowLoadMore(holder.getLayoutPosition()))
{
setFullSpan(holder);
}
}
private void setFullSpan(RecyclerView.ViewHolder holder)
{
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if (lp != null
&& lp instanceof StaggeredGridLayoutManager.LayoutParams)
{
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
p.setFullSpan(true);
}
}
@Override
public int getItemCount()
{
return mInnerAdapter.getItemCount() + (hasLoadMore() ? 1 : 0);
}
public interface OnLoadMoreListener
{
void onLoadMoreRequested();
}
private OnLoadMoreListener mOnLoadMoreListener;
public LoadMoreWrapper setOnLoadMoreListener(OnLoadMoreListener loadMoreListener)
{
if (loadMoreListener != null)
{
mOnLoadMoreListener = loadMoreListener;
}
return this;
}
public LoadMoreWrapper setLoadMoreView(View loadMoreView)
{
mLoadMoreView = loadMoreView;
return this;
}
public LoadMoreWrapper setLoadMoreView(int layoutId)
{
mLoadMoreLayoutId = layoutId;
return this;
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<ImageView
android:id="@+id/iv_photo"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="centerCrop"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="@id/view"
app:layout_constraintTop_toTopOf="@id/view"
tools:src="@mipmap/ic_launcher"
/>
<ImageView
android:id="@+id/iv_del"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/dp_5"
android:src="@mipmap/ic_successful"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<View
android:id="@+id/view"
android:layout_width="1px"
android:layout_height="1px"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@id/iv_del"
app:layout_constraintLeft_toLeftOf="@id/iv_del"
app:layout_constraintRight_toRightOf="@id/iv_del"
app:layout_constraintTop_toTopOf="@id/iv_del"
/>
</FrameLayout>
\ No newline at end of file
...@@ -6,16 +6,15 @@ ...@@ -6,16 +6,15 @@
android:layout_marginLeft="10dp" android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:background="@android:color/transparent" android:background="@android:color/transparent"
android:orientation="vertical" android:orientation="vertical">
android:paddingBottom="10dp">
<android.support.v7.widget.AppCompatButton <android.support.v7.widget.AppCompatButton
android:id="@+id/photodialog_btn_take" android:id="@+id/photodialog_btn_take"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="50dp" android:layout_height="50dp"
android:background="@drawable/rect_white_l4t4" android:background="@null"
android:gravity="center" android:gravity="center"
android:text="拍照" android:text="@string/sdk_photograph"
android:textColor="#323232" /> android:textColor="#323232" />
<View <View
...@@ -28,26 +27,24 @@ ...@@ -28,26 +27,24 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_gravity="center" android:layout_gravity="center"
android:background="@drawable/rect_white_b4r4" android:background="@null"
android:gravity="center" android:gravity="center"
android:text="相册" android:text="@string/sdk_album"
android:textColor="#323232" /> android:textColor="#323232" />
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="10dp" android:layout_height="0.5dp"
android:layout_gravity="center" android:background="@color/colorEF" />
android:background="@android:color/transparent"
android:gravity="center" />
<android.support.v7.widget.AppCompatButton <android.support.v7.widget.AppCompatButton
android:id="@+id/photodialog_btn_cancel" android:id="@+id/photodialog_btn_cancel"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_gravity="center" android:layout_gravity="center"
android:background="@drawable/rect_white_4dc" android:background="@null"
android:gravity="center" android:gravity="center"
android:text="取消" android:text="@string/cancel"
android:textColor="@color/colorAccent" /> android:textColor="@color/colorAccent" />
</android.support.v7.widget.LinearLayoutCompat> </android.support.v7.widget.LinearLayoutCompat>
\ No newline at end of file
...@@ -570,4 +570,11 @@ ...@@ -570,4 +570,11 @@
<string name="picture_audio_error">The audio is corrupted</string> <string name="picture_audio_error">The audio is corrupted</string>
<string name="picture_confirm">Cancel</string> <string name="picture_confirm">Cancel</string>
<string name="picture_message_video_max_num">You can choose%1$s videos at most</string> <string name="picture_message_video_max_num">You can choose%1$s videos at most</string>
<string name="many_times_you_have_refused_authorization_has_been_detected_please_manually_open_the_camera_privileges_">It has been detected that you have refused authorization for many times. Please open the camera permission manually</string>
<string name="authorization_failed_and_the_camera_was_unavailable">Authorization failed, unable to use camera</string>
<string name="sdk_photograph">photograph</string>
<string name="sdk_album">album</string>
</resources> </resources>
\ No newline at end of file
...@@ -566,4 +566,11 @@ ...@@ -566,4 +566,11 @@
<string name="picture_video_error">ビデオが破</string> <string name="picture_video_error">ビデオが破</string>
<string name="picture_audio_error">オーディオ</string> <string name="picture_audio_error">オーディオ</string>
<string name="picture_confirm">決定</string> <string name="picture_confirm">決定</string>
<string name="many_times_you_have_refused_authorization_has_been_detected_please_manually_open_the_camera_privileges_">何度も認証を拒否していることが検出されました。手動でカメラの権限を開いてください。</string>
<string name="authorization_failed_and_the_camera_was_unavailable">認証に失敗しました。カメラを使えませんでした。</string>
<string name="sdk_photograph">写真を撮る</string>
<string name="sdk_album">アルバム</string>
</resources> </resources>
\ No newline at end of file
...@@ -581,4 +581,11 @@ ...@@ -581,4 +581,11 @@
<string name="picture_video_error">동영상 에러</string> <string name="picture_video_error">동영상 에러</string>
<string name="picture_audio_error">오디오 에러</string> <string name="picture_audio_error">오디오 에러</string>
<string name="picture_confirm">확인</string> <string name="picture_confirm">확인</string>
<string name="many_times_you_have_refused_authorization_has_been_detected_please_manually_open_the_camera_privileges_">인증 을 여러 번 거부 한 것 이 검출 되 었 습 니 다. 수 동 으로 카메라 권한 을 열 어 주 십시오.</string>
<string name="authorization_failed_and_the_camera_was_unavailable">인증 실패, 카메라 사용 불가</string>
<string name="sdk_photograph">사진 을 찍다.</string>
<string name="sdk_album">앨범
</string>
</resources> </resources>
...@@ -583,4 +583,10 @@ ...@@ -583,4 +583,10 @@
<string name="picture_video_error">동영상 에러</string> <string name="picture_video_error">동영상 에러</string>
<string name="picture_audio_error">오디오 에러</string> <string name="picture_audio_error">오디오 에러</string>
<string name="picture_confirm">확인</string> <string name="picture_confirm">확인</string>
<string name="many_times_you_have_refused_authorization_has_been_detected_please_manually_open_the_camera_privileges_">인증 을 여러 번 거부 한 것 이 검출 되 었 습 니 다. 수 동 으로 카메라 권한 을 열 어 주 십시오.</string>
<string name="authorization_failed_and_the_camera_was_unavailable">인증 실패, 카메라 사용 불가</string>
<string name="sdk_photograph">사진 을 찍다.</string>
<string name="sdk_album">앨범</string>
</resources> </resources>
...@@ -578,4 +578,10 @@ ...@@ -578,4 +578,10 @@
<string name="picture_video_error">视频已损坏</string> <string name="picture_video_error">视频已损坏</string>
<string name="picture_audio_error">音频已损坏</string> <string name="picture_audio_error">音频已损坏</string>
<string name="picture_confirm">确定</string> <string name="picture_confirm">确定</string>
<string name="many_times_you_have_refused_authorization_has_been_detected_please_manually_open_the_camera_privileges_">检测到您多次拒绝授权,请手动打开相机权限</string>
<string name="authorization_failed_and_the_camera_was_unavailable">授权失败,无法使用相机</string>
<string name="sdk_photograph">拍照</string>
<string name="sdk_album">相册</string>
</resources> </resources>
...@@ -21,4 +21,8 @@ ...@@ -21,4 +21,8 @@
<item name="swipe_refresh_header" type="id" /> <item name="swipe_refresh_header" type="id" />
<item name="swipe_load_more_footer" type="id" /> <item name="swipe_load_more_footer" type="id" />
<item name="swipe_toload_layout" type="id" /> <item name="swipe_toload_layout" type="id" />
<item name="tag_for_position" type="id"/>
<item name="tag_for_view_holder" type="id"/>
<item name="tag_for_view_type" type="id"/>
</resources> </resources>
\ No newline at end of file
...@@ -574,8 +574,14 @@ ...@@ -574,8 +574,14 @@
<string name="picture_audio_error">音频已损坏</string> <string name="picture_audio_error">音频已损坏</string>
<string name="picture_confirm">确定</string> <string name="picture_confirm">确定</string>
<string name="many_times_you_have_refused_authorization_has_been_detected_please_manually_open_the_camera_privileges_">检测到您多次拒绝授权,请手动打开相机权限</string>
<string name="authorization_failed_and_the_camera_was_unavailable">授权失败,无法使用相机</string>
<!-- TODO: Remove or change this placeholder text --> <!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string> <string name="hello_blank_fragment">Hello blank fragment</string>
<string name="title_activity_maps">Map</string> <string name="title_activity_maps">Map</string>
<string name="title_activity_google_maps">Map</string> <string name="title_activity_google_maps">Map</string>
<string name="sdk_photograph">拍照</string>
<string name="sdk_album">相册</string>
</resources> </resources>
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external_files"
path="."/>
</paths>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment