Commit a58c013d authored by feihuaduo's avatar feihuaduo

分享卡组时取消排序

分享卡组操作优化
卡组管理
parent 1cb1cf93
......@@ -104,8 +104,8 @@ dependencies {
//
implementation(name: 'paysdk-release-1.2.4', ext: 'aar')
implementation "com.pgyersdk:sdk:3.0.5"
//dialog库
implementation 'com.github.feihuaduo:DialogUtils:1.8.9'
//recyclerview的adapter库
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
}
......@@ -8,7 +8,7 @@ public class DeckType extends TextSelect {
this.name = name;
this.path = path;
super.setName(name);
super.setObject(this);
setObject(this);
}
public String getName() {
......
package cn.garymb.ygomobile.bean.events;
import androidx.annotation.Nullable;
import java.io.File;
import cn.garymb.ygomobile.bean.TextSelect;
......@@ -14,13 +16,15 @@ public class DeckFile extends TextSelect {
name=new File(path).getName();
name=name.substring(0,name.lastIndexOf("."));
super.setName(name);
super.setObject(this);
setObject(this);
}
public DeckFile(File file) {
path=file.getAbsolutePath();
name=file.getName();
name=name.substring(0,name.lastIndexOf("."));
super.setName(name);
setObject(this);
}
public String getName() {
......@@ -38,4 +42,5 @@ public class DeckFile extends TextSelect {
public void setPath(String path) {
this.path = path;
}
}
package cn.garymb.ygomobile.ui.adapters;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygomobile.bean.TextSelect;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.utils.YGOUtil;
public class TextSelectAdapter extends RecyclerView.Adapter<TextSelectAdapter.ViewHolder> {
public class TextSelectAdapter<T extends TextSelect> extends BaseQuickAdapter<T, BaseViewHolder> {
private OnItemSelectListener onItemSelectListener;
private List<? extends TextSelect> data;
private int selectPosition;
public TextSelectAdapter(List<? extends TextSelect> data, int selectPosition) {
this.data = data;
this.selectPosition = selectPosition;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_select_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.tv_name.setText(data.get(position).getName());
if (position==selectPosition){
holder.view.setBackgroundColor(YGOUtil.c(R.color.gray));
}else {
holder.view.setBackgroundColor(YGOUtil.c(R.color.white));
}
holder.view.setOnClickListener(new View.OnClickListener() {
private boolean isSelect;
private boolean isManySelect;
private List<T> selectList;
public TextSelectAdapter(List<T> data, int select) {
super(R.layout.text_select_item, data);
this.selectPosition = select;
if (select >= 0)
isSelect = true;
else
isSelect = false;
isManySelect = false;
selectList = new ArrayList<>();
setOnItemClickListener(new OnItemClickListener() {
@Override
public void onClick(View v) {
if (position==selectPosition)
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
if (isSelect && position == selectPosition)
return;
selectPosition = position;
notifyDataSetChanged();
onItemSelectListener.onItemSelect(position, data.get(position).getObject());
if (onItemSelectListener != null)
onItemSelectListener.onItemSelect(position, data.get(position).getObject());
}
});
}
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
this.onItemSelectListener = onItemSelectListener;
@Override
protected void convert(BaseViewHolder helper, T item) {
int position = helper.getAdapterPosition();
helper.setText(R.id.tv_name, item.getName());
if (isManySelect) {
if (selectList.contains(item))
helper.setBackgroundColor(R.id.ll_layout, YGOUtil.c(R.color.gray));
else
helper.setBackgroundRes(R.id.ll_layout, R.drawable.click_background);
} else if (isSelect) {
if (position == selectPosition) {
helper.setBackgroundColor(R.id.ll_layout, YGOUtil.c(R.color.gray));
} else {
helper.setBackgroundRes(R.id.ll_layout, R.drawable.click_background);
}
}else {
helper.setBackgroundRes(R.id.ll_layout, R.drawable.click_background);
}
}
@Override
public int getItemCount() {
return data.size();
public void setSelectPosition(int selectPosition) {
this.selectPosition = selectPosition;
}
public boolean isSelect() {
return isSelect;
}
class ViewHolder extends RecyclerView.ViewHolder {
public boolean isManySelect() {
return isManySelect;
}
View view;
TextView tv_name;
public void addManySelect(T t) {
if (selectList.contains(t))
selectList.remove(t);
else
selectList.add(t);
}
public ViewHolder(View view) {
super(view);
this.view = view;
this.tv_name = view.findViewById(R.id.tv_name);
public void setManySelect(boolean manySelect) {
isManySelect = manySelect;
if (!isManySelect) {
selectList.clear();
notifyDataSetChanged();
}
}
public List<T> getSelectList() {
return selectList;
}
public int getSelectPosition() {
return selectPosition;
}
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
this.onItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener<T> {
void onItemSelect(int position, T item);
}
......
......@@ -17,7 +17,9 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
......@@ -51,7 +53,9 @@ import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.bean.Deck;
import cn.garymb.ygomobile.bean.DeckInfo;
import cn.garymb.ygomobile.bean.DeckType;
import cn.garymb.ygomobile.bean.events.CardInfoEvent;
import cn.garymb.ygomobile.bean.events.DeckFile;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.activities.WebActivity;
import cn.garymb.ygomobile.ui.adapters.SimpleSpinnerAdapter;
......@@ -61,6 +65,7 @@ import cn.garymb.ygomobile.ui.cards.deck.DeckItem;
import cn.garymb.ygomobile.ui.cards.deck.DeckItemTouchHelper;
import cn.garymb.ygomobile.ui.cards.deck.DeckItemType;
import cn.garymb.ygomobile.ui.cards.deck.DeckLayoutManager;
import cn.garymb.ygomobile.ui.mycard.mcchat.util.ImageUtil;
import cn.garymb.ygomobile.ui.mycard.mcchat.util.Util;
import cn.garymb.ygomobile.ui.plus.AOnGestureListener;
import cn.garymb.ygomobile.ui.plus.DefaultOnBoomListener;
......@@ -79,7 +84,7 @@ import ocgcore.enums.LimitType;
import static cn.garymb.ygomobile.Constants.YDK_FILE_EX;
class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerViewItemListener.OnItemListener, OnItemDragListener {
class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerViewItemListener.OnItemListener, OnItemDragListener, YGODialogUtil.OnDeckMenuListener {
//region ui onCreate/onDestroy
private RecyclerView mRecyclerView;
......@@ -95,14 +100,12 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
private CardDetail mCardDetail;
private DialogPlus mDialog;
private DialogPlus builderShareLoading;
private DialogUtils du;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
du=DialogUtils.getdx(this);
tv_deck=$(R.id.tv_deck);
tv_deck = $(R.id.tv_deck);
mDeckSpinner = $(R.id.toolbar_list);
mDeckSpinner.setPopupBackgroundResource(R.color.colorNavy);
mLimitSpinner = $(R.id.sp_limit_list);
......@@ -158,11 +161,12 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
tv_deck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
YGODialogUtil.dialogDeckSelect(DeckManagerActivityImpl.this,null);
YGODialogUtil.dialogDeckSelect(DeckManagerActivityImpl.this, AppsSettings.get().getLastDeckPath(), DeckManagerActivityImpl.this);
}
});
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
......@@ -288,10 +292,11 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
if (file != null && file.exists()) {
String name = IOUtils.tirmName(file.getName(), Constants.YDK_FILE_EX);
setActionBarSubTitle(name);
if (inDeckDir(file)) {
//deck文件夹里面的,则保存文件
mSettings.setLastDeckPath(file.getAbsolutePath());
}
// if (inDeckDir(file)) {
//记住最后打开的卡组
mSettings.setLastDeckPath(file.getAbsolutePath());
tv_deck.setText(name);
// }
} else {
setActionBarSubTitle(getString(R.string.noname));
}
......@@ -604,10 +609,10 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
case R.id.action_save:
if (mPreLoadFile != null && mPreLoadFile == mDeckAdapater.getYdkFile()) {
//需要保存到deck文件夹
inputDeckName(mPreLoadFile, true);
inputDeckName(mPreLoadFile, null, true);
} else {
if (mDeckAdapater.getYdkFile() == null) {
inputDeckName(null, true);
inputDeckName(null, null, true);
} else {
save(mDeckAdapater.getYdkFile());
}
......@@ -621,32 +626,12 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
// }
// break;
case R.id.action_rename:
inputDeckName(mDeckAdapater.getYdkFile(), false);
inputDeckName(mDeckAdapater.getYdkFile(), null, false);
break;
case R.id.action_deck_new:
createDeck(null);
break;
case R.id.action_deck_new: {
final File old = mDeckAdapater.getYdkFile();
DialogPlus builder = new DialogPlus(this);
builder.setTitle(R.string.question);
builder.setMessage(R.string.question_keep_cur_deck);
builder.setMessageGravity(Gravity.CENTER_HORIZONTAL);
builder.setLeftButtonListener((dlg, rs) -> {
dlg.dismiss();
//复制当前卡组
inputDeckName(old, true);
});
builder.setRightButtonListener((dlg, rs) -> {
dlg.dismiss();
setCurDeck(null);
inputDeckName(null, true);
});
builder.setOnCloseLinster((dlg) -> {
dlg.dismiss();
setCurDeck(null);
inputDeckName(null, true);
});
builder.show();
}
break;
case R.id.action_clear_deck: {
DialogPlus builder = new DialogPlus(this);
builder.setTitle(R.string.question);
......@@ -695,43 +680,67 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
return true;
}
private void createDeck(String savePath) {
final File old = mDeckAdapater.getYdkFile();
DialogPlus builder = new DialogPlus(this);
builder.setTitle(R.string.question);
builder.setMessage(R.string.question_keep_cur_deck);
builder.setMessageGravity(Gravity.CENTER_HORIZONTAL);
builder.setLeftButtonListener((dlg, rs) -> {
dlg.dismiss();
//复制当前卡组
inputDeckName(old, savePath, true);
});
builder.setRightButtonListener((dlg, rs) -> {
dlg.dismiss();
setCurDeck(null);
inputDeckName(null, savePath, true);
});
builder.setOnCloseLinster((dlg) -> {
dlg.dismiss();
setCurDeck(null);
inputDeckName(null, savePath, true);
});
builder.show();
}
private File getFirstYdk() {
List<File> files = getYdkFiles();
return files == null || files.size() == 0 ? null : files.get(0);
}
private void shareDeck(){
builderShareLoading = new DialogPlus(this);
private void shareDeck() {
builderShareLoading = new DialogPlus(this);
builderShareLoading.showProgressBar();
builderShareLoading.hideTitleBar();
builderShareLoading.setMessage(R.string.Pre_share);
builderShareLoading.show();
//先排序
mDeckAdapater.sort();
// mDeckAdapater.sort();
//保存
if (mPreLoadFile != null && mPreLoadFile == mDeckAdapater.getYdkFile()) {
//需要保存到deck文件夹
inputDeckName(mPreLoadFile, true);
} else {
if (mDeckAdapater.getYdkFile() == null) {
inputDeckName(null, true);
} else {
save(mDeckAdapater.getYdkFile());
}
}
//保存成功后重新加载卡组
File file = getSelectDeck(mDeckSpinner);
if (file != null) {
loadDeckFromFile(file);
}
//延时一秒,等排好序再分享
// if (mPreLoadFile != null && mPreLoadFile == mDeckAdapater.getYdkFile()) {
// //需要保存到deck文件夹
// inputDeckName(mPreLoadFile, null, true);
// } else {
// if (mDeckAdapater.getYdkFile() == null) {
// inputDeckName(null, null, true);
// } else {
// save(mDeckAdapater.getYdkFile());
// }
// }
// //保存成功后重新加载卡组
// File file = getSelectDeck(mDeckSpinner);
// if (file != null) {
// loadDeckFromFile(file);
// }
//延时半秒,使整体看起来更流畅
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
shareDeck1();
}
},1000);
}, 500);
}
private void shareDeck1() {
......@@ -758,14 +767,42 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
}
String savePath = new File(AppsSettings.get().getDeckSharePath(), deckName + ".jpg").getAbsolutePath();
BitmapUtil.saveBitmap(bitmap, savePath, 50);
ShareUtil.shareImage(DeckManagerActivityImpl.this, "卡组分享", savePath, null);
//复制前关闭决斗助手
stopService(new Intent(this, ServiceDuelAssistant.class));
Util.fzMessage(this,mDeckAdapater.getDeckInfo().toDeck().toAppUri().toString());
showToast(getString(R.string.deck_text_copyed));
//复制完毕开启决斗助手
Util.startDuelService(this);
builderShareLoading.dismiss();
DialogUtils du = DialogUtils.getdx(DeckManagerActivityImpl.this);
View viewDialog = du.dialogBottomSheet(R.layout.dialog_deck_share);
ImageView iv_image = viewDialog.findViewById(R.id.iv_image);
Button bt_image_share = viewDialog.findViewById(R.id.bt_image_share);
Button bt_code_share = viewDialog.findViewById(R.id.bt_code_share);
EditText et_code = viewDialog.findViewById(R.id.et_code);
et_code.setText(mDeckAdapater.getDeckInfo().toDeck().toAppUri().toString());
ImageUtil.setImage(DeckManagerActivityImpl.this, savePath, iv_image);
bt_code_share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
du.dis();
stopService(new Intent(DeckManagerActivityImpl.this, ServiceDuelAssistant.class));
Util.fzMessage(DeckManagerActivityImpl.this, et_code.getText().toString().trim());
showToast(getString(R.string.deck_text_copyed));
//复制完毕开启决斗助手
Util.startDuelService(DeckManagerActivityImpl.this);
}
});
bt_image_share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
du.dis();
ShareUtil.shareImage(DeckManagerActivityImpl.this, "卡组分享", savePath, null);
}
});
//复制前关闭决斗助手
// String label = TextUtils.isEmpty(deck.getName()) ? getString(R.string.share_deck) : deck.getName();
// final String uriString = deck.toAppUri().toString();
// final String httpUri = deck.toHttpUri().toString();
......@@ -931,9 +968,8 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
});
}
private void inputDeckName(File oldYdk, boolean keepOld) {
private void inputDeckName(File oldYdk, String savePath, boolean keepOld) {
DialogPlus builder = new DialogPlus(this);
// AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.intpu_name);
EditText editText = new EditText(this);
editText.setGravity(Gravity.TOP | Gravity.LEFT);
......@@ -953,7 +989,11 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
if (!filename.endsWith(YDK_FILE_EX)) {
filename += YDK_FILE_EX;
}
File ydk = new File(mSettings.getResourcePath(), Constants.CORE_DECK_PATH + "/" + filename);
File ydk;
if (TextUtils.isEmpty(savePath))
ydk = new File(mSettings.getDeckDir(), filename);
else
ydk = new File(savePath, filename);
if (ydk.exists()) {
showToast(R.string.file_exist, Toast.LENGTH_SHORT);
return;
......@@ -1034,4 +1074,56 @@ class DeckManagerActivityImpl extends BaseCardsAcitivity implements RecyclerView
menuButton.addBuilder(builder);
mMenuIds.put(mMenuIds.size(), menuId);
}
@Override
public void onDeckSelect(DeckFile deckFile) {
loadDeckFromFile(new File(deckFile.getPath()));
}
@Override
public void onDeckDel(List<DeckFile> deckFileList) {
String currentDeckPath = mDeckAdapater.getYdkFile().getAbsolutePath();
for (DeckFile deckFile : deckFileList) {
if (deckFile.getPath().equals(currentDeckPath)) {
List<File> files = getYdkFiles();
File file = null;
if (files != null && files.size() > 0) {
file = files.get(0);
}
if (file != null) {
loadDeckFromFile(file);
} else {
setCurDeck(new DeckInfo());
}
return;
}
}
}
@Override
public void onDeckMove(List<DeckFile> deckFileList, DeckType toDeckType) {
String currentDeckPath = mDeckAdapater.getYdkFile().getAbsolutePath();
for (DeckFile deckFile : deckFileList) {
if (deckFile.getPath().equals(currentDeckPath)) {
loadDeckFromFile(new File(toDeckType.getPath(), deckFile.getName() + ".ydk"));
return;
}
}
}
@Override
public void onDeckCopy(List<DeckFile> deckFileList, DeckType toDeckType) {
String currentDeckPath = mDeckAdapater.getYdkFile().getAbsolutePath();
for (DeckFile deckFile : deckFileList) {
if (deckFile.getPath().equals(currentDeckPath)) {
loadDeckFromFile(new File(toDeckType.getPath(), deckFile.getName() + ".ydk"));
return;
}
}
}
@Override
public void onDeckNew(DeckType currentDeckType) {
createDeck(currentDeckType.getPath());
}
}
......@@ -66,7 +66,7 @@ public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {
vh.ic_name.setText(cm.getName());
//vh.ic_time.setText(cm.getTime());
vh.ic_message.setText(cm.getMessage());
ImageUtil.tuxian(context, cm.getAvatar(), vh.ic_avatar);
ImageUtil.setAvatar(context, cm.getAvatar(), vh.ic_avatar);
if (position != 0) {
if (cm.getName().equals(data.get(position - 1).getName())) {
vh.ic_name.setVisibility(View.GONE);
......
package cn.garymb.ygomobile.ui.mycard.mcchat.util;
import android.content.Context;
import android.graphics.ColorFilter;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.net.Uri;
import android.util.Log;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.util.HashMap;
import java.util.Map;
import cn.garymb.ygomobile.lite.R;
public class ImageUtil {
public static void tuxian(Context context, String url, final ImageView im) {
public static void setAvatar(Context context, String url, final ImageView im) {
if (url != null) {
Glide.with(context)
.load(Uri.parse(url))
......@@ -21,4 +29,28 @@ public class ImageUtil {
}
}
public static void setImage(Context context, String url, final ImageView im) {
if (url != null) {
Glide.with(context)
.load(url)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.placeholder(R.drawable.unknown)
.into(im);
}
}
public static void setGrayImage(int key, ImageView imageView) {
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
imageView.setColorFilter(filter);
}
public static void reImageColor(int key,ImageView imageView) {
imageView.setColorFilter(null);
}
}
......@@ -40,6 +40,7 @@ import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.ServiceDuelAssistant;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import cn.garymb.ygomobile.ui.preference.PreferenceFragmentPlus;
import cn.garymb.ygomobile.utils.FileUtils;
import cn.garymb.ygomobile.utils.IOUtils;
import cn.garymb.ygomobile.utils.SystemUtils;
import ocgcore.ConfigManager;
......@@ -402,7 +403,7 @@ public class SettingFragment extends PreferenceFragmentPlus {
process.waitFor();
IOUtils.delete(soFile);
IOUtils.copyFile(file, soFile.getAbsolutePath(), true);
FileUtils.copyFile(file, soFile.getAbsolutePath(), true);
me.what = COPY_SO_OK;
} catch (Exception e) {
e.printStackTrace();
......
......@@ -3,6 +3,7 @@ package cn.garymb.ygomobile.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
......@@ -114,6 +115,54 @@ public class FileUtils {
}
}
public static void copyFile(String oldPath, String newPath, boolean isName) throws FileNotFoundException, IOException {
//判断复制后的路径是否含有文件名,如果没有则加上
if (!isName) {
//由于newPath是路径加文件名,所以获取要复制的文件名与复制后的路径组成新的newPath
String abb[]=oldPath.split("/");
newPath = newPath + "/" + abb[abb.length - 1];
}
FileInputStream fis=new FileInputStream(oldPath);
FileOutputStream fos=new FileOutputStream(newPath);
byte[] buf=new byte[1024];
int len=0;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
fis.close();
}
public static void moveFile(String oldPath, String newPath, boolean isName) throws FileNotFoundException, IOException {
//判断复制后的路径是否含有文件名,如果没有则加上
if (!isName) {
//由于newPath是路径加文件名,所以获取要复制的文件名与复制后的路径组成新的newPath
String abb[]=oldPath.split("/");
newPath = newPath + "/" + abb[abb.length - 1];
}
FileInputStream fis=new FileInputStream(oldPath);
FileOutputStream fos=new FileOutputStream(newPath);
byte[] buf=new byte[1024];
int len=0;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
fis.close();
//删除文件
File file=new File(oldPath);
if (file.exists() && file.isFile()) {
file.delete();
}
}
public static void copy(InputStream in, OutputStream out) throws IOException {
byte[] data = new byte[1024 * 8];
int len;
......
......@@ -225,26 +225,6 @@ public class IOUtils {
return false;
}
public static void copyFile(String oldPath, String newPath, boolean isname) throws FileNotFoundException, IOException {
//判断复制后的路径是否含有文件名,如果没有则加上
if (!isname) {
//由于newPath是路径加文件名,所以获取要复制的文件名与复制后的路径组成新的newPath
String abb[]=oldPath.split("/");
newPath = newPath + "/" + abb[abb.length - 1];
}
FileInputStream fis=new FileInputStream(oldPath);
FileOutputStream fos=new FileOutputStream(newPath);
byte[] buf=new byte[1024];
int len=0;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
fis.close();
}
public static File asFile(InputStream is, String outPath) throws IOException {
OutputStream os = null;
......
package cn.garymb.ygomobile.utils;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.InputType;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.feihua.dialogutils.util.DialogUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygomobile.AppsSettings;
......@@ -18,53 +32,80 @@ import cn.garymb.ygomobile.bean.DeckType;
import cn.garymb.ygomobile.bean.events.DeckFile;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.adapters.TextSelectAdapter;
import cn.garymb.ygomobile.ui.mycard.mcchat.util.ImageUtil;
import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.utils.recyclerview.DeckTypeTouchHelperCallback;
public class YGODialogUtil {
public static void dialogDeckSelect(Context context, String selectDeckPath) {
View viewDialog = DialogUtils.getdx(context).dialogBottomSheet(R.layout.dialog_deck_select);
private static final int IMAGE_MOVE = 0;
private static final int IMAGE_COPY = 1;
private static final int IMAGE_DEL = 2;
private static LinearLayout ll_move, ll_copy, ll_del, ll_add;
private static ImageView iv_move, iv_copy, iv_del;
private static TextView tv_move, tv_copy, tv_del;
private static TextSelectAdapter typeAdp, deckAdp;
private static Dialog ygoDialog;
public static void dialogDeckSelect(Context context, String selectDeckPath, OnDeckMenuListener onDeckMenuListener) {
DialogUtils du = DialogUtils.getdx(context);
View viewDialog = du.dialogBottomSheet(R.layout.dialog_deck_select);
RecyclerView rv_type, rv_deck;
rv_deck = viewDialog.findViewById(R.id.rv_deck);
rv_type = viewDialog.findViewById(R.id.rv_type);
ll_move = viewDialog.findViewById(R.id.ll_move);
ll_copy = viewDialog.findViewById(R.id.ll_copy);
ll_del = viewDialog.findViewById(R.id.ll_del);
ll_add = viewDialog.findViewById(R.id.ll_add);
iv_copy = viewDialog.findViewById(R.id.iv_copy);
iv_move = viewDialog.findViewById(R.id.iv_move);
iv_del = viewDialog.findViewById(R.id.iv_del);
tv_move = viewDialog.findViewById(R.id.tv_move);
tv_copy = viewDialog.findViewById(R.id.tv_copy);
tv_del = viewDialog.findViewById(R.id.tv_del);
hideAllDeckUtil();
rv_deck.setLayoutManager(new LinearLayoutManager(context));
rv_type.setLayoutManager(new LinearLayoutManager(context));
TextSelectAdapter typeAdp, deckAdp;
List<DeckType> typeList = DeckUtil.getDeckTypeList(context);
int typeSelectPosition=2;
int deckSelectPosition=-1;
List<DeckFile> deckList ;
int typeSelectPosition = 2;
int deckSelectPosition = -1;
List<DeckFile> deckList;
if (selectDeckPath != null) {
String name = new File(selectDeckPath).getParentFile().getName();
if (name.equals("pack") || name.equals("cacheDeck")) {
//卡包
typeSelectPosition=0;
typeSelectPosition = 0;
} else if (name.equals("Decks")) {
//ai卡组
typeSelectPosition=1;
typeSelectPosition = 1;
} else if (name.equals("deck") && new File(selectDeckPath).getParentFile().getParentFile().getName().equals(Constants.PREF_DEF_GAME_DIR)) {
//如果是deck并且上一个目录是ygocore的话,保证不会把名字为deck的卡包识别为未分类
typeSelectPosition=2;
typeSelectPosition = 2;
} else {
//其他卡包
for (int i=3;i<typeList.size();i++){
DeckType deckType=typeList.get(i);
if(deckType.getName().equals(name)){
typeSelectPosition=i;
for (int i = 3; i < typeList.size(); i++) {
DeckType deckType = typeList.get(i);
if (deckType.getName().equals(name)) {
typeSelectPosition = i;
break;
}
}
}
}
deckList = DeckUtil.getDeckList(typeList.get(typeSelectPosition).getPath());
typeAdp = new TextSelectAdapter(typeList, typeSelectPosition);
deckAdp = new TextSelectAdapter(deckList, deckSelectPosition);
typeAdp = new TextSelectAdapter<>(typeList, typeSelectPosition);
deckAdp = new TextSelectAdapter<>(deckList, deckSelectPosition);
rv_type.setAdapter(typeAdp);
rv_deck.setAdapter(deckAdp);
typeAdp.setOnItemSelectListener(new TextSelectAdapter.OnItemSelectListener<DeckType>() {
@Override
public void onItemSelect(int position, DeckType item) {
clearDeckSelect();
deckList.clear();
deckList.addAll(DeckUtil.getDeckList(item.getPath()));
if (position == 0) {
......@@ -82,13 +123,299 @@ public class YGODialogUtil {
deckAdp.setOnItemSelectListener(new TextSelectAdapter.OnItemSelectListener<DeckFile>() {
@Override
public void onItemSelect(int position, DeckFile item) {
DialogUtils.getdx(context).dis();
if (deckAdp.isManySelect()) {
deckAdp.addManySelect(item);
deckAdp.notifyItemChanged(position);
} else {
dis();
onDeckMenuListener.onDeckSelect(item);
}
}
});
// rv_deck.setAdapter();
deckAdp.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
if (deckAdp.isSelect() || typeAdp.getSelectPosition() == 0)
return true;
deckAdp.setManySelect(true);
if (typeAdp.getSelectPosition() == 1) {
showCopyDeckUtil();
} else {
showAllDeckUtil();
}
deckAdp.addManySelect((DeckFile) adapter.getItem(position));
deckAdp.notifyItemChanged(position);
return true;
}
});
ll_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
du.dialogl("新建", new String[]{"分类", "卡组"}).setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
du.dis();
switch (position) {
case 0:
DialogPlus builder = new DialogPlus(context);
builder.setTitle("请输入分类名");
EditText editText = new EditText(context);
editText.setGravity(Gravity.TOP | Gravity.LEFT);
editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
editText.setSingleLine();
builder.setContentView(editText);
builder.setOnCloseLinster((dlg) -> {
dlg.dismiss();
});
builder.setLeftButtonListener((dlg, s) -> {
String name = editText.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
YGOUtil.show("名称不能为空");
return;
}
File file = new File(AppsSettings.get().getDeckDir(), name);
IOUtils.createFolder(file);
typeList.add(new DeckType(name, file.getAbsolutePath()));
typeAdp.notifyItemInserted(typeList.size() - 1);
dlg.dismiss();
});
builder.show();
break;
case 1:
onDeckMenuListener.onDeckNew(typeList.get(typeAdp.getSelectPosition()));
dis();
break;
}
}
});
}
});
ll_move.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<DeckType> otherType = getOtherTypeList();
du.dialogl("请选择要移动到的分类", getStringType(otherType)).setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
du.dis();
DeckType toType = otherType.get(position);
List<DeckFile> deckFileList = deckAdp.getSelectList();
for (DeckFile deckFile : deckFileList) {
try {
FileUtils.moveFile(deckFile.getPath(), toType.getPath(), false);
} catch (IOException e) {
e.printStackTrace();
}
deckList.remove(deckFile);
}
YGOUtil.show("移动完毕");
onDeckMenuListener.onDeckMove(deckAdp.getSelectList(), toType);
clearDeckSelect();
}
});
}
});
ll_copy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<DeckType> otherType = getOtherTypeList();
du.dialogl("请选择要复制到的分类", getStringType(otherType)).setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
du.dis();
DeckType toType = otherType.get(position);
List<DeckFile> deckFileList = deckAdp.getSelectList();
for (DeckFile deckFile : deckFileList) {
try {
FileUtils.copyFile(deckFile.getPath(), toType.getPath(), false);
} catch (IOException e) {
e.printStackTrace();
}
deckList.remove(deckFile);
}
YGOUtil.show("复制完毕");
onDeckMenuListener.onDeckCopy(deckAdp.getSelectList(), toType);
clearDeckSelect();
}
});
}
});
ll_del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (deckAdp.getSelectList().size() == 0) {
YGOUtil.show("未选中卡组");
return;
}
DialogPlus dialogPlus = new DialogPlus(context);
dialogPlus.setMessage("确定删除这些卡组吗?");
dialogPlus.setLeftButtonText(YGOUtil.s(R.string.delete));
dialogPlus.setRightButtonText("取消");
dialogPlus.setLeftButtonListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
List<DeckFile> selectDeckList = deckAdp.getSelectList();
for (DeckFile deckFile : selectDeckList) {
new File(deckFile.getPath()).delete();
deckList.remove(deckFile);
}
YGOUtil.show("删除完毕");
dialogPlus.dismiss();
onDeckMenuListener.onDeckDel(selectDeckList);
clearDeckSelect();
}
});
dialogPlus.setRightButtonListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialogPlus.dismiss();
}
});
dialogPlus.show();
}
});
ygoDialog = du.getDialog();
ygoDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
clearDeckSelect();
}
});
ygoDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (deckAdp.isManySelect()) {
clearDeckSelect();
return true;
}
}
return false;
}
});
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new DeckTypeTouchHelperCallback(new OnDeckTypeListener() {
@Override
public void onDeckTypeListener(int positon) {
File file = new File(typeList.get(positon).getPath());
File[] files = file.listFiles();
List<DeckFile> deckFileList = new ArrayList<>();
if (files != null) {
for (File file1 : files) {
deckFileList.add(new DeckFile(file1));
}
}
IOUtils.delete(file);
YGOUtil.show("删除完毕");
onDeckMenuListener.onDeckDel(deckFileList);
typeAdp.remove(positon);
if (typeAdp.getSelectPosition() == positon) {
typeAdp.setSelectPosition(2);
typeAdp.notifyItemChanged(2);
}
clearDeckSelect();
deckList.clear();
deckList.addAll(DeckUtil.getDeckList(typeList.get(2).getPath()));
deckAdp.notifyDataSetChanged();
}
}));
itemTouchHelper.attachToRecyclerView(rv_type);
}
private static String[] getStringType(List<DeckType> deckTypeList) {
String[] types = new String[deckTypeList.size()];
for (int i = 0; i < types.length; i++) {
types[i] = deckTypeList.get(i).getName();
}
return types;
}
//获取可以移动的分类
private static List<DeckType> getOtherTypeList() {
List<DeckType> typeList = typeAdp.getData();
List<DeckType> moveTypeList = new ArrayList<>();
DeckType selectType = typeList.get(typeAdp.getSelectPosition());
for (int i = 2; i < typeList.size(); i++) {
DeckType deckType = typeList.get(i);
if (!deckType.getPath().equals(selectType.getPath())) {
moveTypeList.add(deckType);
}
}
return moveTypeList;
}
public interface OnDeckMenuListener {
void onDeckSelect(DeckFile deckFile);
void onDeckDel(List<DeckFile> deckFileList);
void onDeckMove(List<DeckFile> deckFileList, DeckType toDeckType);
void onDeckCopy(List<DeckFile> deckFileList, DeckType toDeckType);
void onDeckNew(DeckType currentDeckType);
}
private static void showAllDeckUtil() {
ImageUtil.reImageColor(IMAGE_MOVE, iv_move);
ImageUtil.reImageColor(IMAGE_DEL, iv_del);
ImageUtil.reImageColor(IMAGE_COPY, iv_copy);
tv_del.setTextColor(YGOUtil.c(R.color.black));
tv_copy.setTextColor(YGOUtil.c(R.color.black));
tv_move.setTextColor(YGOUtil.c(R.color.black));
ll_del.setEnabled(true);
ll_copy.setEnabled(true);
ll_move.setEnabled(true);
}
private static void hideAllDeckUtil() {
ImageUtil.setGrayImage(IMAGE_MOVE, iv_move);
ImageUtil.setGrayImage(IMAGE_DEL, iv_del);
ImageUtil.setGrayImage(IMAGE_COPY, iv_copy);
tv_del.setTextColor(YGOUtil.c(R.color.gray));
tv_copy.setTextColor(YGOUtil.c(R.color.gray));
tv_move.setTextColor(YGOUtil.c(R.color.gray));
ll_del.setEnabled(false);
ll_copy.setEnabled(false);
ll_move.setEnabled(false);
}
private static void showCopyDeckUtil() {
ImageUtil.setGrayImage(IMAGE_MOVE, iv_move);
ImageUtil.setGrayImage(IMAGE_DEL, iv_del);
ImageUtil.reImageColor(IMAGE_COPY, iv_copy);
tv_del.setTextColor(YGOUtil.c(R.color.gray));
tv_copy.setTextColor(YGOUtil.c(R.color.black));
tv_move.setTextColor(YGOUtil.c(R.color.gray));
ll_del.setEnabled(false);
ll_copy.setEnabled(true);
ll_move.setEnabled(false);
}
private static void clearDeckSelect() {
deckAdp.setManySelect(false);
hideAllDeckUtil();
}
public static void dis() {
if (ygoDialog != null)
ygoDialog.dismiss();
}
public interface OnDeckTypeListener {
void onDeckTypeListener(int position);
}
}
......@@ -5,6 +5,7 @@ import android.widget.Toast;
import androidx.core.content.ContextCompat;
import cn.garymb.ygomobile.App;
import cn.garymb.ygomobile.lite.R;
public class YGOUtil {
......@@ -16,4 +17,7 @@ public class YGOUtil {
public static int c(int colorId){
return ContextCompat.getColor(App.get(),colorId);
}
public static String s(int stringId){
return App.get().getResources().getString(stringId);
}
}
package cn.garymb.ygomobile.utils.recyclerview;
import android.content.DialogInterface;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import cn.garymb.ygomobile.bean.DeckType;
import cn.garymb.ygomobile.bean.events.DeckFile;
import cn.garymb.ygomobile.ui.adapters.TextSelectAdapter;
import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.utils.IOUtils;
import cn.garymb.ygomobile.utils.YGODialogUtil;
import cn.garymb.ygomobile.utils.YGOUtil;
public class DeckTypeTouchHelperCallback extends ItemTouchHelper.Callback {
private int dragFlags;
private int swipeFlags;
private RecyclerView recyclerView;
private YGODialogUtil.OnDeckTypeListener onDeckTypeListener;
public DeckTypeTouchHelperCallback(YGODialogUtil.OnDeckTypeListener onDeckTypeListener) {
this.onDeckTypeListener = onDeckTypeListener;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder p2) {
dragFlags = 0;
swipeFlags = 0;
this.recyclerView = recyclerView;
if (p2.getAdapterPosition() > 2)
swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView p1, RecyclerView.ViewHolder p2, RecyclerView.ViewHolder p3) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder vh, int dire) {
int positon = vh.getAdapterPosition();
TextSelectAdapter textSelectAdapter = ((TextSelectAdapter) recyclerView.getAdapter());
DialogPlus dialogPlus = new DialogPlus(recyclerView.getContext());
dialogPlus.setMessage("确定删除该分类吗?分类下的卡组也将全部被删除");
dialogPlus.setLeftButtonText("删除");
dialogPlus.setRightButtonText("取消");
dialogPlus.setLeftButtonListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialogPlus.dismiss();
onDeckTypeListener.onDeckTypeListener(positon);
}
});
dialogPlus.setRightButtonListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
textSelectAdapter.notifyItemChanged(positon);
dialog.dismiss();
}
});
dialogPlus.show();
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:padding="10dp"
android:text="卡组管理"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_add"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/click_background"
android:gravity="center"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_add"
android:layout_width="30dp"
android:layout_height="30dp"
app:srcCompat="@drawable/ic_add" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="新建"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_move"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/click_background"
android:gravity="center"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_move"
android:layout_width="30dp"
android:layout_height="30dp"
app:srcCompat="@drawable/ic_move" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_move"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="移动"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_copy"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/click_background"
android:gravity="center"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_copy"
android:layout_width="30dp"
android:layout_height="30dp"
app:srcCompat="@drawable/ic_copy" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_copy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="复制"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_del"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/click_background"
android:gravity="center"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_del"
android:layout_width="30dp"
android:layout_height="30dp"
app:srcCompat="@drawable/ic_del" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_del"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="删除"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
......@@ -13,17 +133,26 @@
android:id="@+id/rv_type"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<View
android:background="@color/gray"
android:layout_width="1dp"
android:layout_height="match_parent"/>
android:layout_weight="1"
android:nestedScrollingEnabled="false" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_deck"
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/gray" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
android:layout_weight="2"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_deck"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="true" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/share_deck"
android:textColor="@color/black"
android:textSize="23sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_image"
android:layout_width="140dp"
android:layout_height="280dp"
android:layout_marginTop="20dp"
android:scaleType="centerCrop" />
<Button
android:id="@+id/bt_image_share"
android:layout_marginTop="20dp"
android:textSize="15sp"
android:text="图片分享"
android:layout_width="140dp"
android:layout_height="50dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp">
<androidx.appcompat.widget.AppCompatEditText
android:textColor="@color/black"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:id="@+id/et_code"
android:gravity="center"
android:textSize="16sp"
android:inputType="text"
android:background="@color/gray"
android:padding="10dp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<Button
android:id="@+id/bt_code_share"
android:textSize="15sp"
android:text="卡组码分享"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:gravity="center"
android:background="@drawable/click_background"
......
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