提交 7ca2533b 编写于 作者: 勇敢di牛牛's avatar 勇敢di牛牛

实现背单词以及数据库的相关功能

上级 d5f6f068
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="WordBook" />
<version value="1" />
<list>
<mapping class="com.example.testapp.database.Word" />
<mapping class="com.example.testapp.database.Interpretation" />
<mapping class="com.example.testapp.database.Phrase" />
<mapping class="com.example.testapp.database.Sentence" />
</list>
</litepal>
\ No newline at end of file
package com.example.testapp.Adapter;
// 获取词书封面,标题,简介,下载状态。
import static android.content.ContentValues.TAG;
import static com.example.testapp.R.drawable.ic_collected;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.example.testapp.R;
import com.example.testapp.bean.BookItemBean;
import java.util.List;
public class BookListAdapter extends RecyclerView.Adapter<BookListAdapter.InnerHolder> {
private final List<BookItemBean> mData;
public BookListAdapter(List<BookItemBean> data){
mData = data;
}
@Override
public InnerHolder onCreateViewHolder( ViewGroup parent, int viewType) {
//复用布局
View view = View.inflate(parent.getContext(),R.layout.word_book_card,null);
return new InnerHolder(view);
}
@Override
public void onBindViewHolder(@NonNull BookListAdapter.InnerHolder holder, int position) {
holder.setData(mData.get(position));
}
@Override
public int getItemCount() {
if(mData != null){
return mData.size();
}
return 0;
}
public class InnerHolder extends RecyclerView.ViewHolder {
View view;
ImageView imgView;
TextView name,introduce;
Button button;
public InnerHolder(@NonNull View itemView) {
super(itemView);
view = itemView;
imgView = view.findViewById(R.id.book_image);
name = view.findViewById(R.id.book_name);
introduce = view.findViewById(R.id.book_introduce);
button = view.findViewById(R.id.book_download);
}
public void setData(BookItemBean bean) {
Log.i(TAG, String.valueOf(Uri.parse(bean.BookImg)));
Glide.with(imgView).load(bean.BookImg).into(imgView);
//imgView.setImageURI(Uri.parse(bean.BookImg));
name.setText(bean.BookName);
introduce.setText(bean.BookIntroduce);
}
}
}
package com.example.testapp.Adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.example.testapp.R;
import com.example.testapp.entity.ItemPhrase;
import java.util.List;
public class DetailPhraseAdapter extends RecyclerView.Adapter<DetailPhraseAdapter.ViewHolder> {
private List<ItemPhrase> mItemPhraseList;
static class ViewHolder extends RecyclerView.ViewHolder {
TextView textEn, textCn;
public ViewHolder(View itemView) {
super(itemView);
textEn = itemView.findViewById(R.id.text_wd_item_phrase_en);
textCn = itemView.findViewById(R.id.text_wd_item_phrase_cn);
}
}
public DetailPhraseAdapter(List<ItemPhrase> mItemPhraseList) {
this.mItemPhraseList = mItemPhraseList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wd_phrase, parent, false);
final ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ItemPhrase itemPhrase = mItemPhraseList.get(position);
holder.textCn.setText(itemPhrase.getCn());
holder.textEn.setText(itemPhrase.getEn());
}
@Override
public int getItemCount() {
return mItemPhraseList.size();
}
}
package com.example.testapp.Adapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.example.testapp.R;
import com.example.testapp.Util.MediaHelper;
import com.example.testapp.entity.ItemSentence;
import java.util.List;
public class DetailSentenceAdapter extends RecyclerView.Adapter<DetailSentenceAdapter.ViewHolder> {
private List<ItemSentence> mItemSentenceList;
private static final String TAG = "DetailSentenceAdapter";
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView imgVoice;
TextView textEn, textCn;
public ViewHolder(View itemView) {
super(itemView);
imgVoice = itemView.findViewById(R.id.img_wd_item_sentence_voice);
textEn = itemView.findViewById(R.id.text_wd_item_sen_en);
textCn = itemView.findViewById(R.id.text_wd_item_sen_cn);
}
}
public DetailSentenceAdapter(List<ItemSentence> mItemSentenceList) {
this.mItemSentenceList = mItemSentenceList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wd_sentence, parent, false);
final ViewHolder holder = new ViewHolder(view);
holder.imgVoice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
final ItemSentence itemSentence = mItemSentenceList.get(position);
// 播放
new Thread(new Runnable() {
@Override
public void run() {
MediaHelper.play(itemSentence.getEn());
}
}).start();
Log.d(TAG, itemSentence.getEn());
}
});
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ItemSentence itemSentence = mItemSentenceList.get(position);
holder.textCn.setText(itemSentence.getCn());
holder.textEn.setText(itemSentence.getEn());
}
@Override
public int getItemCount() {
return mItemSentenceList.size();
}
}
package com.example.testapp;
import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.testapp.Util.MediaHelper;
import com.example.testapp.Util.TimeController;
import com.example.testapp.database.Interpretation;
import com.example.testapp.database.Sentence;
import com.example.testapp.database.Word;
import com.example.testapp.entity.ItemWordMeanChoice;
import org.litepal.LitePal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class LearnWordActivity extends AppCompatActivity implements View.OnClickListener{
private int NowId;
private RecyclerView recyclerView;
private RelativeLayout layoutDelete, layoutVoice, layoutTip;
private List<ItemWordMeanChoice> wordMeanChoices = new ArrayList<>();
private LinearLayout layoutBottomReview;
private LinearLayout layoutBottomLearn;
private TextView textWord, textWordPhone;
private TextView textLastWord, textLastWordMean;
private int[] randomId;
private RelativeLayout cardKnow, cardNotKnow, cardDark;
private CardView cardTip;
private TextView textTip;
// 记录上一个单词
public static String lastWord;
public static String lastWordMean;
private TextView textLearnNum, textReviewNum;
private static final String TAG = "LearnWordActivity";
public static boolean needUpdate = true;
// 学习时间记录
private long startTime = -1;
public static final String MODE_NAME = "learnmode";
public static final int MODE_GENERAL = 1;
public static final int MODE_ONCE = 2;
private int currentMode;
private String tipSentence;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_learn_word);
init();
//寻找控件
NowId = 1;
setWord();
}
private void setWord() {
cardTip.setVisibility(View.INVISIBLE); //影藏句子提醒
List<Word> words = LitePal.where("wordId = ?", + NowId + "").find(Word.class);
Log.i(TAG, String.valueOf(words.toArray().length));
textWord.setText(words.get(0).getWord());
//查询提示的句子
List<Sentence> sentences = LitePal.where("wordId = ?", NowId + "").find(Sentence.class);
if (!sentences.isEmpty())
tipSentence = sentences.get(0).getEnSentence();
}
private void init() {
recyclerView = findViewById(R.id.recyclerview_word_mean);
layoutBottomReview = findViewById(R.id.layout_word_bottom);
layoutBottomLearn = findViewById(R.id.linear_learn_control);
textWord = findViewById(R.id.text_learn_word);
textWordPhone = findViewById(R.id.text_learn_word_phone);
cardDark = findViewById(R.id.card_dark);
cardDark.setOnClickListener(this);
cardKnow = findViewById(R.id.card_know);
cardKnow.setOnClickListener(this);
cardNotKnow = findViewById(R.id.card_no_know);
cardNotKnow.setOnClickListener(this);
textLearnNum = findViewById(R.id.text_new_num_top);
textReviewNum = findViewById(R.id.text_review_num_top);
textLastWord = findViewById(R.id.text_word_top);
textLastWordMean = findViewById(R.id.text_word_top_mean);
layoutTip = findViewById(R.id.layout_word_tip);
layoutTip.setOnClickListener(this);
layoutDelete = findViewById(R.id.layout_word_delete);
layoutDelete.setOnClickListener(this);
layoutVoice = findViewById(R.id.layout_word_voice);
layoutVoice.setOnClickListener(this);
cardTip = findViewById(R.id.card_lw_tip);
textTip = findViewById(R.id.text_lw_tip);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.card_dark:
if (!TextUtils.isEmpty(tipSentence.trim())) {
textTip.setText(tipSentence);
cardTip.setVisibility(View.VISIBLE);
MediaHelper.play(tipSentence);
} else {
Toast.makeText(this, "暂无提示", Toast.LENGTH_SHORT).show();
}
break;
case R.id.card_no_know:
WordDetailActivity.wordId = NowId;
Intent intent = new Intent();
intent.setClass(LearnWordActivity.this, WordDetailActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(WordDetailActivity.TYPE_NAME, WordDetailActivity.TYPE_LEARN);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(LearnWordActivity.this).toBundle());
break;
case R.id.card_know:
NowId++;
setWord();
break;
case R.id.layout_word_tip:
break;
case R.id.layout_word_delete:
break;
case R.id.layout_word_voice:
MediaHelper.play(textWord.getText().toString());
break;
}
}
@Override
public void onBackPressed() {
Intent intent = new Intent(LearnWordActivity.this, MainActivity.class);
startActivity(intent);
MediaHelper.releasePlayer();
finish();
}
@Override
protected void onStart() {
super.onStart();
}
private void showLearn() {
recyclerView.setVisibility(View.GONE);
layoutBottomReview.setVisibility(View.GONE);
layoutBottomLearn.setVisibility(View.VISIBLE);
}
private void showReview() {
recyclerView.setVisibility(View.VISIBLE);
layoutBottomReview.setVisibility(View.VISIBLE);
layoutBottomLearn.setVisibility(View.GONE);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
package com.example.testapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class ReciteWord extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recite_word);
}
}
\ No newline at end of file
package com.example.testapp;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.example.testapp.Util.JsonHelper;
import com.example.testapp.bean.WordItem;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class TestActivity extends Activity {
Button buttonW;
Button buttonDownLoad;
EditText edt;
TextView textview;
String TAG = "TestActivity";
Boolean haveWrite = false;
String title;
String context;
private ProgressDialog progressDialog;
List<WordItem> words;
private Thread thread;
private final int FINISH = 1;
private final int DOWN_DONE = 2;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case FINISH:
progressDialog.dismiss();
haveWrite = true;
break;
case DOWN_DONE:
progressDialog.setMessage("已下载完成,正在解压分析数据中...");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
buttonW = findViewById(R.id.button1);
buttonDownLoad = findViewById(R.id.btn_download);
edt = findViewById(R.id.edt2);
textview = findViewById(R.id.textView);
buttonDownLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
progressDialog = new ProgressDialog(TestActivity.this);
progressDialog.setTitle("请稍等");
progressDialog.setMessage("数据包正在下载中...");
progressDialog.setCancelable(false);
progressDialog.show();
String url = "https://nnggb.com/test/CET4luan_1.json";
DownJson(url);
}
});
buttonW.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(TestActivity.this,LearnWordActivity.class);
startActivity(intent);
}
});
}
private void DownJson(String url){
// 下载json并保存到数据库
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// 开启线程分析数据
thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Log.i(TAG, "开始网络线程");
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
Message message = new Message();
String resStr = response.body().string();
message.what = DOWN_DONE;
handler.sendMessage(message);
Log.i(TAG, "下载成功");
String jsonStr = resStr.replace("\n{\"wordRank\"", ",{\"wordRank\"");
String json = "[" + jsonStr.substring(0) + "]"; ////格式化为标准json数组格式
Log.i(TAG, "开始解析json到数据库中>>>>");
JsonHelper.analyseDefaultAndSave(json);
} catch (IOException e) {
e.printStackTrace();
}
Message message = new Message();
message.what = FINISH;
handler.sendMessage(message);
Log.i(TAG, "json文件解析完成!");
}
});
thread.start();
}
}, 500);
}
}
\ No newline at end of file
package com.example.testapp.Util;
import android.util.Log;
import com.example.testapp.bean.JsonPhrase;
import com.example.testapp.bean.JsonSentence;
import com.example.testapp.bean.JsonTran;
import com.example.testapp.bean.WordItem;
import com.example.testapp.database.Interpretation;
import com.example.testapp.database.Phrase;
import com.example.testapp.database.Sentence;
import com.example.testapp.database.Word;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.litepal.LitePal;
import java.util.ArrayList;
import java.util.List;
// JSON工具类
public class JsonHelper {
private static final String TAG = "JsonHelper";
// 采用Google的GSON开源框架
public static Gson gson = new Gson();
// 解析默认词库数据文件,并存放到数据库中
public static void analyseDefaultAndSave(String jsonContent) {
if (!LitePal.findAll(Word.class).isEmpty()) {
LitePal.deleteAll(Word.class);
LitePal.deleteAll(Interpretation.class);
LitePal.deleteAll(Phrase.class);
LitePal.deleteAll(Sentence.class);
}
// 解析的数据格式
List<JsonSentence> jsonSentences = new ArrayList<>();
List<JsonTran> jsonTrans = new ArrayList<>();
List<JsonPhrase> jsonPhrases = new ArrayList<>();
List<WordItem> jsonWordList = gson.fromJson(jsonContent, new TypeToken<List<WordItem>>() {}.getType());
String word1 = jsonWordList.get(0).getHeadWord();
Log.i(TAG,word1);
for (WordItem jsonWord : jsonWordList) {
Log.i(TAG,jsonWord.getHeadWord());
Word word = new Word();
// 设置ID
word.setWordId(jsonWord.getWordRank());
// 设置单词
word.setWord(jsonWord.getHeadWord());
// 设置音标
if (jsonWord.getContent().getWord().getContent().getUkphone() != null) {
if (jsonWord.getContent().getWord().getContent().getUkphone().indexOf(";") == -1)
word.setUkPhone("[;'" +
";]'" +
"" + jsonWord.getContent().getWord().getContent().getUkphone() + "]");
else
word.setUkPhone("[" + jsonWord.getContent().getWord().getContent().getUkphone().split(";")[0] + "]");
}
if (jsonWord.getContent().getWord().getContent().getUsphone() != null) {
if (jsonWord.getContent().getWord().getContent().getUsphone().indexOf(";") == -1)
word.setUsPhone("[" + jsonWord.getContent().getWord().getContent().getUsphone() + "]");
else
word.setUsPhone("[" + jsonWord.getContent().getWord().getContent().getUsphone().split(";")[0] + "]");
}
// 设置图片
if (jsonWord.getContent().getWord().getContent().getPicture() != null)
word.setPicAddress(jsonWord.getContent().getWord().getContent().getPicture());
// 设置巧记
if (jsonWord.getContent().getWord().getContent().getRemMethod() != null)
word.setRemMethod(jsonWord.getContent().getWord().getContent().getRemMethod().getVal());
// 设置归属书目
word.setBelongBook(jsonWord.getBookId());
// 保存
word.save();
/*至此,单词的基本内容已经保存,接下来把其他表的数据保存并绑定到这个单词上*/
// 设置短语
if (jsonWord.getContent().getWord().getContent().getPhrase() != null) {
jsonPhrases = jsonWord.getContent().getWord().getContent().getPhrase().getPhrases();
for (JsonPhrase jsonPhrase : jsonPhrases) {
Phrase phrase = new Phrase();
phrase.setChsPhrase(jsonPhrase.getpCn());
phrase.setEnPhrase(jsonPhrase.getpContent());
phrase.setWordId(jsonWord.getWordRank());
phrase.save();
}
}
// 设置释义
jsonTrans = jsonWord.getContent().getWord().getContent().getTrans();
for (JsonTran jsonTran : jsonTrans) {
Interpretation interpretation = new Interpretation();
interpretation.setWordType(jsonTran.getPos());
interpretation.setCHSMeaning(jsonTran.getTranCn().replace(";;", ";").replace(",",","));
interpretation.setENMeaning(jsonTran.getTranOther());
interpretation.setWordId(jsonWord.getWordRank());
interpretation.save();
}
// 设置例句
if (jsonWord.getContent().getWord().getContent().getSentence() != null) {
jsonSentences = jsonWord.getContent().getWord().getContent().getSentence().getSentences();
for (JsonSentence jsonSentence : jsonSentences) {
Sentence sentence = new Sentence();
sentence.setChsSentence(jsonSentence.getsCn());
sentence.setEnSentence(jsonSentence.getsContent());
sentence.setWordId(jsonWord.getWordRank());
sentence.save();
}
}
// 清空数据,防止重复
jsonPhrases.clear();
jsonSentences.clear();
jsonTrans.clear();
}
Log.d(TAG, "analyseDefaultAndSave: ");
}
}
package com.example.testapp.Util;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import com.example.testapp.config.ConstantData;
public class MediaHelper {
public static MediaPlayer mediaPlayer;
// 英文发音
public static final int ENGLISH_VOICE = 1;
// 美国发音
public static final int AMERICA_VOICE = 0;
// 默认
public static final int DEFAULT_VOICE = ENGLISH_VOICE;
private static final String TAG = "MediaHelper";
public static void play(int type, String wordName) {
if (mediaPlayer != null) {
releasePlayer();
mediaPlayer = new MediaPlayer();
} else
mediaPlayer = new MediaPlayer();
try {
if (ENGLISH_VOICE == type)
mediaPlayer.setDataSource(ConstantData.YOU_DAO_VOICE_EN + wordName);
else
mediaPlayer.setDataSource(ConstantData.YOU_DAO_VOICE_USA + wordName);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static void play(String wordName) {
play(DEFAULT_VOICE, wordName);
}
public static void playInternetSource(String address) {
if (mediaPlayer != null) {
releasePlayer();
mediaPlayer = new MediaPlayer();
} else
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(address);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static void releasePlayer() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
mediaPlayer = null;
}
}
public static void playLocalFile(int sourceAddress) {
if (mediaPlayer != null) {
releasePlayer();
mediaPlayer = new MediaPlayer();
} else
mediaPlayer = new MediaPlayer();
try {
AssetFileDescriptor fileDescriptor = MyApplication.getContext().getResources().openRawResourceFd(sourceAddress);
mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static void playLocalFileRepeat(final int sourceAddress) {
if (mediaPlayer != null) {
releasePlayer();
mediaPlayer = new MediaPlayer();
} else
mediaPlayer = new MediaPlayer();
try {
AssetFileDescriptor fileDescriptor = MyApplication.getContext().getResources().openRawResourceFd(sourceAddress);
mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
playLocalFileRepeat(sourceAddress);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.example.testapp.Util;
import android.app.Application;
import android.content.Context;
import androidx.appcompat.app.AppCompatDelegate;
import org.litepal.LitePal;
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
LitePal.initialize(this);
}
public static Context getContext() {
return context;
}
}
package com.example.testapp.Util;
import android.util.Log;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/*时间管理*/
public class TimeController {
public static final String FORMAT_NOTIME = "yyyy-MM-dd";
public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_NOTIME);
public static long todayDate;
private static final String TAG = "TimeController";
/*----日期类----*/
// 得到当前日期戳(不带时间,只有日期)
public static long getCurrentDateStamp() {
Calendar cal = Calendar.getInstance();
int currentYear = cal.get(Calendar.YEAR);
int currentMonth = cal.get(Calendar.MONTH) + 1;
int currentDate = cal.get(Calendar.DATE);
long time = 0;
try {
time = simpleDateFormat.parse(currentYear + "-" + currentMonth + "-" + currentDate).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
Log.d(TAG, "getCurrentDateStamp: " + time);
return time;
}
// 根据指定日期戳解析成日期形式(yyyy-MM-dd)
public static String getStringDate(long timeStamp) {
return simpleDateFormat.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
}
// 根据指定日期戳解析成日期形式(yyyy-MM-dd)
public static String getStringDateDetail(long timeStamp) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
}
// 得到当前日期的指定间隔后的日期
public static long getDateByDays(long time, int intervalDay) throws ParseException {
// 转换成Calendar
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time);
calendar.add(Calendar.DATE, intervalDay);
return calendar.getTimeInMillis();
}
// 返回两个日期之间相隔多少天
public static int daysInternal(long time1, long time2) throws ParseException {
Date date1 = simpleDateFormat.parse(getStringDate(time1));
Date date2 = simpleDateFormat.parse(getStringDate(time2));
int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
return days;
}
/*----时间类----*/
// 得到当前时间戳(有日期与时间)
public static long getCurrentTimeStamp() {
return System.currentTimeMillis();
}
// 判断两个时间戳是否为同一天
public static boolean isTheSameDay(long time1, long time2) {
return getStringDate(time1).equals(getStringDate(time2));
}
// 返回过去第几天的日期
public static String getPastDate(int past) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("MM-dd");
String result = format.format(today);
return result;
}
// 返回过去第几天的日期(有年份)
public static String getPastDateWithYear(int past) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String result = format.format(today);
return result;
}
// 获取n天以后的日期
public static String getDayAgoOrAfterString(int num) {
Calendar calendar1 = Calendar.getInstance();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");
calendar1.add(Calendar.DATE, num);
return sdf1.format(calendar1.getTime());
}
}
package com.example.testapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import com.example.testapp.Adapter.BookListAdapter;
import com.example.testapp.bean.BookData;
import com.example.testapp.bean.BookItemBean;
import java.util.ArrayList;
import java.util.List;
public class WordBook extends AppCompatActivity {
RecyclerView bookList;
SwipeRefreshLayout swipeRefresh;
private List<BookItemBean> mdata;
BookListAdapter adapter;
String TAG = "WordBook";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_word_book);
bookList = this.findViewById(R.id.book_list);
swipeRefresh = this.findViewById(R.id.book_refresh);
initData();
handlerRefresh();
}
private void handlerRefresh() {
swipeRefresh.setEnabled(true);
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
//@SuppressLint("NotifyDataSetChanged")
@SuppressLint("NotifyDataSetChanged")
@Override
public void onRefresh() {
//新建一条数据
Log.i(TAG, "onRefresh:刷新数据");
BookItemBean data = new BookItemBean();
data.BookName = "新书";
data.isDownload = false;
data.BookIntroduce = "我是新添加的书本";
data.BookImg = "https://img0.baidu.com/it/u=3939618057,2844598562&fm=253&fmt=auto&app=138&f=JPEG?w=350&h=350";
mdata.add(0,data);
adapter.notifyDataSetChanged();
swipeRefresh.setRefreshing(false);
}
});
}
private void initData() {
mdata = new ArrayList<>();
for(int i = 0; i< BookData.images.length; i++){
BookItemBean data = new BookItemBean();
data.BookImg = BookData.images[i];
data.BookIntroduce = "我是第" + String.valueOf(i) + "本书";
data.isDownload = false;
data.BookName = "考研词汇书";
mdata.add(data);
}
//创建适配器
LinearLayoutManager manger = new LinearLayoutManager(this);
//bookList.addItemDecoration();
bookList.setLayoutManager(manger);
adapter = new BookListAdapter(mdata);
bookList.setAdapter(adapter);
}
}
\ No newline at end of file
package com.example.testapp.bean;
public class BookData {
public static String[] images ={
"https://nos.netease.com/ydschool-online/1496632727200CET4luan_1.jpg",
"https://nos.netease.com/ydschool-online/1496655382926CET6luan_1.jpg",
"https://nos.netease.com/ydschool-online/1496632762670KaoYanluan_1.jpg",
"https://nos.netease.com/ydschool-online/youdao_CET6_2.jpg",
"https://nos.netease.com/ydschool-online/youdao_KaoYan_2.jpg"
};
}
package com.example.testapp.bean;
public class BookItemBean {
public String BookImg;
public String BookIntroduce;
public String BookName;
public Boolean isDownload;
}
package com.example.testapp.bean;
import java.util.List;
public class JsonContent {
private String usphone;
private String ukphone;
private String picture;
private JsonSentenceContent sentence;
private JsonPhraseContent phrase;
private JsonRemMethod remMethod;
private List<JsonTran> trans;
public String getUsphone() {
return usphone;
}
public void setUsphone(String usphone) {
this.usphone = usphone;
}
public String getUkphone() {
return ukphone;
}
public void setUkphone(String ukphone) {
this.ukphone = ukphone;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
public JsonSentenceContent getSentence() {
return sentence;
}
public void setSentence(JsonSentenceContent sentence) {
this.sentence = sentence;
}
public JsonPhraseContent getPhrase() {
return phrase;
}
public void setPhrase(JsonPhraseContent phrase) {
this.phrase = phrase;
}
public JsonRemMethod getRemMethod() {
return remMethod;
}
public void setRemMethod(JsonRemMethod remMethod) {
this.remMethod = remMethod;
}
public List<JsonTran> getTrans() {
return trans;
}
public void setTrans(List<JsonTran> trans) {
this.trans = trans;
}
}
package com.example.testapp.bean;
public class JsonContentWord {
private String wordHead;
private String wordId;
private JsonContent content;
public String getWordHead() {
return wordHead;
}
public void setWordHead(String wordHead) {
this.wordHead = wordHead;
}
public String getWordId() {
return wordId;
}
public void setWordId(String wordId) {
this.wordId = wordId;
}
public JsonContent getContent() {
return content;
}
public void setContent(JsonContent content) {
this.content = content;
}
}
package com.example.testapp.bean;
public class JsonPhrase {
private String pContent;
private String pCn;
public String getpContent() {
return pContent;
}
public void setpContent(String pContent) {
this.pContent = pContent;
}
public String getpCn() {
return pCn;
}
public void setpCn(String pCn) {
this.pCn = pCn;
}
}
package com.example.testapp.bean;
import java.util.List;
public class JsonPhraseContent {
private List<JsonPhrase> phrases;
private String desc;
public List<JsonPhrase> getPhrases() {
return phrases;
}
public void setPhrases(List<JsonPhrase> phrases) {
this.phrases = phrases;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.example.testapp.bean;
public class JsonRemMethod {
String val;
String desc;
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.example.testapp.bean;
public class JsonSentence {
private String sContent;
private String sCn;
public String getsContent() {
return sContent;
}
public void setsContent(String sContent) {
this.sContent = sContent;
}
public String getsCn() {
return sCn;
}
public void setsCn(String sCn) {
this.sCn = sCn;
}
}
package com.example.testapp.bean;
import java.util.List;
public class JsonSentenceContent {
private List<JsonSentence> sentences;
private String desc;
public List<JsonSentence> getSentences() {
return sentences;
}
public void setSentences(List<JsonSentence> sentences) {
this.sentences = sentences;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.example.testapp.bean;
public class JsonTran {
private String tranCn;
private String descOther;
private String pos;
private String descCn;
private String tranOther;
public String getTranCn() {
return tranCn;
}
public void setTranCn(String tranCn) {
this.tranCn = tranCn;
}
public String getDescOther() {
return descOther;
}
public void setDescOther(String descOther) {
this.descOther = descOther;
}
public String getPos() {
return pos;
}
public void setPos(String pos) {
this.pos = pos;
}
public String getDescCn() {
return descCn;
}
public void setDescCn(String descCn) {
this.descCn = descCn;
}
public String getTranOther() {
return tranOther;
}
public void setTranOther(String tranOther) {
this.tranOther = tranOther;
}
}
package com.example.testapp.bean;
public class JsonWordTotal {
private JsonContentWord word;
public JsonContentWord getWord() {
return word;
}
public void setWord(JsonContentWord word) {
this.word = word;
}
}
package com.example.testapp.bean;
public class WordItem {
// 单词序号
private int wordRank;
// 单词名称
private String headWord;
// 单词内容
private JsonWordTotal content;
// 单词归属数目
private String bookId;
public int getWordRank() {
return wordRank;
}
public void setWordRank(int wordRank) {
this.wordRank = wordRank;
}
public String getHeadWord() {
return headWord;
}
public void setHeadWord(String headWord) {
this.headWord = headWord;
}
public JsonWordTotal getContent() {
return content;
}
public void setContent(JsonWordTotal content) {
this.content = content;
}
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
}
\ No newline at end of file
package com.example.testapp.config;
import com.example.testapp.R;
// 存放不变的数据(常量)
public class ConstantData {
// 数据存放目录(外置存储卡)
public static final String DIR_TOTAL = "englishLearning";
// 解压后的数据目录
public static final String DIR_AFTER_FINISH = "json";
// 书默认ID
public static final int CET4_WORDBOOK = 1;
public static final int CET6_WORDBOOK = 2;
public static final int KAOYAN_WORDBOOK = 3;
public static final int CET6ALL = 4;
public static final int KAOYANALL = 5;
// 背景图API
public static final String IMG_API = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1";
public static final String IMG_API_BEFORE = "https://www.bing.com";
// 每日一句API
public static final String DAILY_SENTENCE_API = "https://open.iciba.com/dsapi/";
// 有道英音发音
public static final String YOU_DAO_VOICE_EN = "https://dict.youdao.com/dictvoice?type=1&audio=";
// 有道美音发音
public static final String YOU_DAO_VOICE_USA = "https://dict.youdao.com/dictvoice?type=0&audio=";
// raw资源正确提示音
public static final int RIGHT_SIGN = R.raw.right;
// raw资源错误提示音
public static final int WRONG_SIGN = R.raw.wrong;
// 通知渠道ID
public static final String channelId = "default";
public static final String channelId2 = "default2";
// 通知渠道名称
public static final String channelName = "默认通知";
public static final String channelName2 = "默认通知2";
// 提示句子集合
public static final String[] phrases = {
"马行软地易失蹄,人贪安逸易失志",
"每天告诉自己一次:我真的很不错",
"没有热忱,世间便无进步",
"有志者,事竟成,破釜沉舟,百二秦关终属楚",
"有心人,天不负,卧薪尝胆,三千越甲可吞吴",
"风尘三尺剑,社稷一戎衣",
"只要站起来的次数比倒下去的次数多,那就是成功",
"收拾一下心情,开始下一个新的开始",
"你配不上自己的野心,也辜负了曾经历的苦难",
"现实很近又很冷,梦想很远却很温暖",
"前方无绝路,希望在转角",
"没有人会让我输,除非我不想赢",
"追踪着鹿的猎人是看不见山的",
"有志始知蓬莱近,无为总觉咫尺远",
"业精于勤而荒于嬉,行成于思而毁于随",
"没有所谓失败,除非你不再尝试"};
// 根据书ID获取该书的单词总量
public static int wordTotalNumberById(int bookId) {
int num = 0;
switch (bookId) {
case CET4_WORDBOOK:
num = 1162;
break;
case CET6_WORDBOOK:
num = 1228;
break;
case KAOYAN_WORDBOOK:
num = 1341;
break;
case CET6ALL:
num = 2078;
break;
case KAOYANALL:
num = 4533;
}
return num;
}
// 根据书ID获取该书的书名
public static String bookNameById(int bookId) {
String name = "";
switch (bookId) {
case CET4_WORDBOOK:
name = "英语四级核心词";
break;
case CET6_WORDBOOK:
name = "英语六级核心词";
break;
case KAOYAN_WORDBOOK:
name = "考研必考词汇";
break;
case CET6ALL:
name = "六级英语大纲";
break;
case KAOYANALL:
name = "考研英语大纲";
break;
}
return name;
}
// 根据书ID获取该书的类型
public static String typeById(int bookId) {
String name = "";
switch (bookId) {
case CET4_WORDBOOK:
name = "四级";
break;
case CET6_WORDBOOK:
case CET6ALL:
name = "六级";
break;
case KAOYAN_WORDBOOK:
case KAOYANALL:
name = "考研";
break;
}
return name;
}
// 根据书ID获取该书的图片
public static String bookPicById(int bookId) {
String picAddress = "";
switch (bookId) {
case CET4_WORDBOOK:
picAddress = "https://nos.netease.com/ydschool-online/1496632727200CET4luan_1.jpg";
break;
case CET6_WORDBOOK:
picAddress = "https://nos.netease.com/ydschool-online/1496655382926CET6luan_1.jpg";
break;
case KAOYAN_WORDBOOK:
picAddress = "https://nos.netease.com/ydschool-online/1496632762670KaoYanluan_1.jpg";
break;
case CET6ALL:
picAddress = "https://nos.netease.com/ydschool-online/youdao_CET6_2.jpg";
break;
case KAOYANALL:
picAddress = "https://nos.netease.com/ydschool-online/youdao_KaoYan_2.jpg";
break;
}
return picAddress;
}
// 根据书ID获取该书的下载地址
public static String bookDownLoadAddressById(int bookId) {
String picAddress = "";
switch (bookId) {
case CET4_WORDBOOK:
picAddress = "http://ydschool-online.nos.netease.com/1523620217431_CET4luan_1.zip";
break;
case CET6_WORDBOOK:
picAddress = "http://ydschool-online.nos.netease.com/1521164660466_CET6luan_1.zip";
break;
case KAOYAN_WORDBOOK:
picAddress = "http://ydschool-online.nos.netease.com/1521164661106_KaoYanluan_1.zip";
break;
case CET6ALL:
picAddress = "http://ydschool-online.nos.netease.com/1524052554766_CET6_2.zip";
break;
case KAOYANALL:
picAddress = "http://ydschool-online.nos.netease.com/1521164654696_KaoYan_2.zip";
break;
}
return picAddress;
}
// 根据书ID获取该书的下载后的文件名
public static String bookFileNameById(int bookId) {
String picAddress = "";
switch (bookId) {
case CET4_WORDBOOK:
picAddress = "CET4luan_1.zip";
break;
case CET6_WORDBOOK:
picAddress = "CET6luan_1.zip";
break;
case KAOYAN_WORDBOOK:
picAddress = "KaoYanluan_1.zip";
break;
case CET6ALL:
picAddress = "CET6_2.zip";
break;
case KAOYANALL:
picAddress = "KaoYan_2.zip";
break;
}
return picAddress;
}
}
package com.example.testapp.config;
public class ServerData {
public final static String SERVER_ADDRESS = "http://139.196.255.54/New";
public final static String SERVER_LOGIN_ADDRESS = SERVER_ADDRESS + "/Login.php";
public final static String SERVER_UPLOAD_RECORD_ADDRESS = SERVER_ADDRESS + "/upload/Record.php";
public final static String SERVER_UPLOAD_INFO_ADDRESS = SERVER_ADDRESS + "/upload/InforFiles.php";
public final static String SERVER_RETURN_BOOKS_ADDRESS = SERVER_ADDRESS + "/upload/GetAllFiles.php";
public final static String LOGIN_SINA_NUM = "sinaNum";
public final static String LOGIN_SINA_NAME = "sinaName";
public final static String TYPE_NAME = "updateType";
public final static String UPLOAD_FILE = "uploadedFile";
public final static String UPLOAD_TYPE = "1";
public final static String RECOVER_TYPE = "2";
}
package com.example.testapp.database;
import org.litepal.crud.LitePalSupport;
public class Interpretation extends LitePalSupport {
// 词性
private String wordType;
// 中文词意
private String CHSMeaning;
// 英文词意
private String ENMeaning;
// 归属单词
private int wordId;
public String getWordType() {
return wordType;
}
public void setWordType(String wordType) {
this.wordType = wordType;
}
public String getCHSMeaning() {
return CHSMeaning;
}
public void setCHSMeaning(String CHSMeaning) {
this.CHSMeaning = CHSMeaning;
}
public String getENMeaning() {
return ENMeaning;
}
public void setENMeaning(String ENMeaning) {
this.ENMeaning = ENMeaning;
}
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
}
package com.example.testapp.database;
import org.litepal.crud.LitePalSupport;
public class Phrase extends LitePalSupport {
// 中文短语
private String chsPhrase;
// 英语短语
private String enPhrase;
// 归属单词
private int wordId;
public String getChsPhrase() {
return chsPhrase;
}
public void setChsPhrase(String chsPhrase) {
this.chsPhrase = chsPhrase;
}
public String getEnPhrase() {
return enPhrase;
}
public void setEnPhrase(String enPhrase) {
this.enPhrase = enPhrase;
}
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
}
package com.example.testapp.database;
import org.litepal.crud.LitePalSupport;
public class Sentence extends LitePalSupport {
// 英文句子
private String enSentence;
// 中文句子
private String chsSentence;
// 归属单词
private int wordId;
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
public String getEnSentence() {
return enSentence;
}
public void setEnSentence(String enSentence) {
this.enSentence = enSentence;
}
public String getChsSentence() {
return chsSentence;
}
public void setChsSentence(String chsSentence) {
this.chsSentence = chsSentence;
}
}
package com.example.testapp.database;
import org.litepal.annotation.Column;
import org.litepal.crud.LitePalSupport;
public class Word extends LitePalSupport {
// ID
@Column(unique = true)
private int wordId;
// 单词
private String word;
// 英国音标
private String ukPhone;
// 美国音标
private String usPhone;
// 巧记
private String remMethod;
// 图片(网址)
private String picAddress;
// 自定义照片
private byte[] picCustom;
// 自定义备注
private String remark;
// 设置归属
private String belongBook;
// 是否收藏
@Column(defaultValue = "0")
private int isCollected;
// 是否是简单词
@Column(defaultValue = "0")
private int isEasy;
// 是否是刚学过
@Column(defaultValue = "0")
private int justLearned;
/*
* 以下是学习复习专用的
*/
// 是否需要学习
@Column(defaultValue = "0")
private int isNeedLearned;
// 需要学习的时间(以天为单位)
private long needLearnDate;
// 需要复习的时间(以天为单位)
private long needReviewDate;
// 是否学习过
@Column(defaultValue = "0")
private int isLearned;
// 总计检验次数
@Column(defaultValue = "0")
private int examNum;
// 总计检验答对次数
@Column(defaultValue = "0")
private int examRightNum;
// 上次已掌握时间(时间戳)
@Column(defaultValue = "0")
private long lastMasterTime;
// 上次复习的时间(时间戳)
@Column(defaultValue = "0")
private long lastReviewTime;
// 掌握程度(总计10分)
@Column(defaultValue = "0")
private int masterDegree;
// 深度掌握次数
/*
* 前提:掌握程度已达到10
* 当深度次数为0时,记下次复习时间=上次已掌握时间+4天,若及时复习,更新上次已掌握时间
* 当深度次数为1时,记下次复习时间=上次已掌握时间+3天,若及时复习,更新上次已掌握时间
* 当深度次数为2时,记下次复习时间=上次已掌握时间+8天,若及时复习,更新上次已掌握时间
* 当深度次数为3时,记已经完全掌握
*
* 检测哪些单词未及时深度复习:
* 首先单词必须掌握程度=10,其次单词上次掌握的时间与现在的时间进行对比
* (1)要是深度次数为0,且两者时间之差为大于4天,说明未深度复习
* (2)要是深度次数为1,且两者时间之差为大于3天,说明未深度复习
* (3)要是深度次数为2,且两者时间之差为大于8天,说明未深度复习
* (#)若未及时深度复习,一律将其单词掌握程度-2(10→8)
*
* */
@Column(defaultValue = "0")
private int deepMasterTimes;
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getUkPhone() {
return ukPhone;
}
public void setUkPhone(String ukPhone) {
this.ukPhone = ukPhone;
}
public String getUsPhone() {
return usPhone;
}
public void setUsPhone(String usPhone) {
this.usPhone = usPhone;
}
public String getRemMethod() {
return remMethod;
}
public void setRemMethod(String remMethod) {
this.remMethod = remMethod;
}
public String getPicAddress() {
return picAddress;
}
public void setPicAddress(String picAddress) {
this.picAddress = picAddress;
}
public byte[] getPicCustom() {
return picCustom;
}
public void setPicCustom(byte[] picCustom) {
this.picCustom = picCustom;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getBelongBook() {
return belongBook;
}
public void setBelongBook(String belongBook) {
this.belongBook = belongBook;
}
public int getIsCollected() {
return isCollected;
}
public void setIsCollected(int isCollected) {
this.isCollected = isCollected;
}
public int getIsEasy() {
return isEasy;
}
public void setIsEasy(int isEasy) {
this.isEasy = isEasy;
}
public int getJustLearned() {
return justLearned;
}
public void setJustLearned(int justLearned) {
this.justLearned = justLearned;
}
public int getIsNeedLearned() {
return isNeedLearned;
}
public void setIsNeedLearned(int isNeedLearned) {
this.isNeedLearned = isNeedLearned;
}
public long getNeedLearnDate() {
return needLearnDate;
}
public void setNeedLearnDate(long needLearnDate) {
this.needLearnDate = needLearnDate;
}
public long getNeedReviewDate() {
return needReviewDate;
}
public void setNeedReviewDate(long needReviewDate) {
this.needReviewDate = needReviewDate;
}
public int getIsLearned() {
return isLearned;
}
public void setIsLearned(int isLearned) {
this.isLearned = isLearned;
}
public int getExamNum() {
return examNum;
}
public void setExamNum(int examNum) {
this.examNum = examNum;
}
public int getExamRightNum() {
return examRightNum;
}
public void setExamRightNum(int examRightNum) {
this.examRightNum = examRightNum;
}
public long getLastMasterTime() {
return lastMasterTime;
}
public void setLastMasterTime(long lastMasterTime) {
this.lastMasterTime = lastMasterTime;
}
public long getLastReviewTime() {
return lastReviewTime;
}
public void setLastReviewTime(long lastReviewTime) {
this.lastReviewTime = lastReviewTime;
}
public int getMasterDegree() {
return masterDegree;
}
public void setMasterDegree(int masterDegree) {
this.masterDegree = masterDegree;
}
public int getDeepMasterTimes() {
return deepMasterTimes;
}
public void setDeepMasterTimes(int deepMasterTimes) {
this.deepMasterTimes = deepMasterTimes;
}
}
package com.example.testapp.database;
import org.litepal.crud.LitePalSupport;
public class WordFolder extends LitePalSupport {
private int id;
private String createTime;
private String name;
private String remark;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
package com.example.testapp.entity;
public class GameWord {
private int id;
private String wordName;
private String wordMeans;
public GameWord(int id, String wordName, String wordMeans) {
this.id = id;
this.wordName = wordName;
this.wordMeans = wordMeans;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWordName() {
return wordName;
}
public void setWordName(String wordName) {
this.wordName = wordName;
}
public String getWordMeans() {
return wordMeans;
}
public void setWordMeans(String wordMeans) {
this.wordMeans = wordMeans;
}
}
package com.example.testapp.entity;
public class IdAnalyse {
private int wordId;
private int position;
public IdAnalyse(int wordId, int position) {
this.wordId = wordId;
this.position = position;
}
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
}
package com.example.testapp.entity;
public class ItemMatch {
private int id;
private String wordString;
private boolean isChosen;
private boolean readyDelete;
public ItemMatch(int id, String wordString, boolean isChosen, boolean readyDelete) {
this.id = id;
this.wordString = wordString;
this.isChosen = isChosen;
this.readyDelete = readyDelete;
}
public boolean isChosen() {
return isChosen;
}
public void setChosen(boolean chosen) {
isChosen = chosen;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWordString() {
return wordString;
}
public void setWordString(String wordString) {
this.wordString = wordString;
}
public boolean isReadyDelete() {
return readyDelete;
}
public void setReadyDelete(boolean readyDelete) {
this.readyDelete = readyDelete;
}
}
package com.example.testapp.entity;
public class ItemPhrase {
private String cn;
private String en;
public ItemPhrase(String cn, String en) {
this.cn = cn;
this.en = en;
}
public String getCn() {
return cn;
}
public void setCn(String cn) {
this.cn = cn;
}
public String getEn() {
return en;
}
public void setEn(String en) {
this.en = en;
}
}
package com.example.testapp.entity;
public class ItemSearch {
private int wordId;
private String wordName;
private String wordSound;
private String wordMeans;
public ItemSearch(int wordId, String wordName, String wordSound, String wordMeans) {
this.wordId = wordId;
this.wordName = wordName;
this.wordSound = wordSound;
this.wordMeans = wordMeans;
}
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
public String getWordName() {
return wordName;
}
public void setWordName(String wordName) {
this.wordName = wordName;
}
public String getWordSound() {
return wordSound;
}
public void setWordSound(String wordSound) {
this.wordSound = wordSound;
}
public String getWordMeans() {
return wordMeans;
}
public void setWordMeans(String wordMeans) {
this.wordMeans = wordMeans;
}
}
package com.example.testapp.entity;
public class ItemSentence {
private String cn;
private String en;
public ItemSentence(String cn, String en) {
this.cn = cn;
this.en = en;
}
public String getCn() {
return cn;
}
public void setCn(String cn) {
this.cn = cn;
}
public String getEn() {
return en;
}
public void setEn(String en) {
this.en = en;
}
}
package com.example.testapp.entity;
public class ItemShow {
private int wordId;
private String word;
private String wordMean;
private boolean isStar;
public ItemShow(int wordId, String word, String wordMean, boolean isStar) {
this.wordId = wordId;
this.word = word;
this.wordMean = wordMean;
this.isStar = isStar;
}
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getWordMean() {
return wordMean;
}
public void setWordMean(String wordMean) {
this.wordMean = wordMean;
}
public boolean isStar() {
return isStar;
}
public void setStar(boolean star) {
isStar = star;
}
}
package com.example.testapp.entity;
public class ItemUpdateSen {
private String chsSentences;
private String enSentences;
public ItemUpdateSen(String chsSentences, String enSentences) {
this.chsSentences = chsSentences;
this.enSentences = enSentences;
}
public String getChsSentences() {
return chsSentences;
}
public void setChsSentences(String chsSentences) {
this.chsSentences = chsSentences;
}
public String getEnSentences() {
return enSentences;
}
public void setEnSentences(String enSentences) {
this.enSentences = enSentences;
}
}
package com.example.testapp.entity;
public class ItemWordBook {
// 单词书ID
private int bookId;
// 单词书名称
private String bookName;
// 单词书单词总数
private int bookWordNum;
// 单词书数据来源
private String bookSource;
// 单词书图片
private String bookImg;
public ItemWordBook(int bookId, String bookName, int bookWordNum, String bookSource, String bookImg) {
this.bookId = bookId;
this.bookName = bookName;
this.bookWordNum = bookWordNum;
this.bookSource = bookSource;
this.bookImg = bookImg;
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public int getBookWordNum() {
return bookWordNum;
}
public void setBookWordNum(int bookWordNum) {
this.bookWordNum = bookWordNum;
}
public String getBookSource() {
return bookSource;
}
public void setBookSource(String bookSource) {
this.bookSource = bookSource;
}
public String getBookImg() {
return bookImg;
}
public void setBookImg(String bookImg) {
this.bookImg = bookImg;
}
}
package com.example.testapp.entity;
public class ItemWordFolder {
private int folderId;
private int wordNum;
private String folderName;
private String folderRemark;
public ItemWordFolder(int folderId, int wordNum, String folderName, String folderRemark) {
this.folderId = folderId;
this.wordNum = wordNum;
this.folderName = folderName;
this.folderRemark = folderRemark;
}
public int getFolderId() {
return folderId;
}
public void setFolderId(int folderId) {
this.folderId = folderId;
}
public int getWordNum() {
return wordNum;
}
public void setWordNum(int wordNum) {
this.wordNum = wordNum;
}
public String getFolderName() {
return folderName;
}
public void setFolderName(String folderName) {
this.folderName = folderName;
}
public String getFolderRemark() {
return folderRemark;
}
public void setFolderRemark(String folderRemark) {
this.folderRemark = folderRemark;
}
}
package com.example.testapp.entity;
public class ItemWordList {
private int wordId;
private String wordName;
private String wordMean;
private boolean isOnClick;
private boolean isSearch;
public ItemWordList(int wordId, String wordName, String wordMean, boolean isOnClick, boolean isSearch) {
this.wordId = wordId;
this.wordName = wordName;
this.wordMean = wordMean;
this.isOnClick = isOnClick;
this.isSearch = isSearch;
}
public int getWordId() {
return wordId;
}
public void setWordId(int wordId) {
this.wordId = wordId;
}
public String getWordName() {
return wordName;
}
public void setWordName(String wordName) {
this.wordName = wordName;
}
public String getWordMean() {
return wordMean;
}
public void setWordMean(String wordMean) {
this.wordMean = wordMean;
}
public boolean isOnClick() {
return isOnClick;
}
public void setOnClick(boolean onClick) {
isOnClick = onClick;
}
public boolean isSearch() {
return isSearch;
}
public void setSearch(boolean search) {
isSearch = search;
}
}
package com.example.testapp.entity;
public class ItemWordMeanChoice {
public static final int NOTSTART = -1;
public static final int RIGHT = 0;
public static final int WRONG = 1;
// ID值,用来与正确的值进行判断
private int id;
// 存放内容
private String wordMean;
// 存放判断状态
// -1代表未选,0代表正确,1代表错误
private int isRight;
public ItemWordMeanChoice(int id, String wordMean, int isRight) {
this.id = id;
this.wordMean = wordMean;
this.isRight = isRight;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWordMean() {
return wordMean;
}
public void setWordMean(String wordMean) {
this.wordMean = wordMean;
}
public int isRight() {
return isRight;
}
public void setRight(int right) {
isRight = right;
}
}
package com.example.testapp.entity;
public class UpdateMeans {
private String chsMeans;
private String enMeans;
public UpdateMeans() {
}
public UpdateMeans(String chsMeans, String enMeans) {
this.chsMeans = chsMeans;
this.enMeans = enMeans;
}
public String getChsMeans() {
return chsMeans;
}
public void setChsMeans(String chsMeans) {
this.chsMeans = chsMeans;
}
public String getEnMeans() {
return enMeans;
}
public void setEnMeans(String enMeans) {
this.enMeans = enMeans;
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:autofit="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBgLittleWhite"
android:fitsSystemWindows="true">
<androidx.cardview.widget.CardView
android:id="@+id/card_word_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="15dp"
app:cardBackgroundColor="@color/colorLightWhite"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp">
<LinearLayout
android:id="@+id/layout_word_top_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:layout_width="17dp"
android:layout_height="17dp"
android:src="@drawable/ic_back" />
<TextView
android:id="@+id/text_word_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:textColor="@color/colorLightGrey"
android:textSize="13sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/text_word_top_mean"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="5dp"
android:layout_toStartOf="@id/layout_word_top_right"
android:layout_toEndOf="@+id/layout_word_top_left"
android:ellipsize="end"
android:maxLines="1"
android:text=""
android:textColor="@color/colorLightGrey"
android:textSize="13sp" />
<LinearLayout
android:id="@+id/layout_word_top_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="2dp"
android:layout_height="10dp"
android:layout_marginStart="15dp"
android:layout_marginEnd="10dp"
android:background="@color/colorLightGrey" />
<TextView
android:id="@+id/text_new_num_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新学15"
android:textColor="@color/colorLightGrey"
android:textSize="13sp" />
<TextView
android:id="@+id/text_review_num_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="复习9"
android:textColor="@color/colorLightGrey"
android:textSize="13sp" />
</LinearLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/linear_word_bottom"
android:layout_below="@+id/card_word_top"
android:layout_marginStart="15dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="20dp"
app:cardBackgroundColor="@color/colorBgWhite"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/text_learn_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:gravity="center"
android:maxLines="1"
android:singleLine="true"
android:text="sentence"
android:textColor="@color/colorMainBlue"
android:textSize="52sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/text_learn_word_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="/'sent(ə)ns/"
android:textColor="@color/colorLightGrey"
android:textSize="15sp" />
<androidx.cardview.widget.CardView
android:id="@+id/card_lw_tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
app:cardBackgroundColor="@color/colorLightWhite"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<TextView
android:id="@+id/text_lw_tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingTop="15dp"
android:paddingEnd="20dp"
android:paddingBottom="15dp"
android:text="This sentence bears no other construction."
android:textColor="@color/colorBlack"
android:textSize="17sp"
android:textStyle="bold" />
</androidx.cardview.widget.CardView>
</LinearLayout>
</androidx.cardview.widget.CardView>
<!--学习界面-->
<!--认识/不认识-->
<!--复习界面-->
<LinearLayout
android:id="@+id/linear_word_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linear_learn_control"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="20dp"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:layout_weight="1"
app:cardBackgroundColor="@color/colorBgWhite"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<RelativeLayout
android:id="@+id/card_know"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:paddingTop="20dp"
android:paddingBottom="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:text="认识"
android:textColor="@color/colorBlack"
android:textSize="15sp"
android:textStyle="bold" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:layout_weight="1"
app:cardBackgroundColor="@color/colorBgWhite"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<RelativeLayout
android:id="@+id/card_dark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:paddingTop="20dp"
android:paddingBottom="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:text="模糊"
android:textColor="@color/colorBlack"
android:textSize="15sp"
android:textStyle="bold" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:cardBackgroundColor="@color/colorBgWhite"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<RelativeLayout
android:id="@+id/card_no_know"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:paddingTop="20dp"
android:paddingBottom="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="不认识"
android:textColor="@color/colorBlack"
android:textSize="15sp"
android:textStyle="bold" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview_word_mean"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:orientation="vertical"
android:overScrollMode="never"
android:scrollbars="none"
android:visibility="gone">
</androidx.recyclerview.widget.RecyclerView>
<LinearLayout
android:id="@+id/layout_word_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="20dp"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<androidx.cardview.widget.CardView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
app:cardBackgroundColor="@color/colorLightWhite"
app:cardCornerRadius="20dp"
app:cardElevation="0dp">
<RelativeLayout
android:id="@+id/layout_word_delete"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/selectableItemBackground">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:src="@drawable/icon_ash" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<androidx.cardview.widget.CardView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerInParent="true"
app:cardBackgroundColor="@color/colorLightWhite"
app:cardCornerRadius="20dp"
app:cardElevation="0dp">
<RelativeLayout
android:id="@+id/layout_word_voice"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/selectableItemBackground">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:scaleType="fitXY"
android:src="@drawable/icon_voice" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<androidx.cardview.widget.CardView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
app:cardBackgroundColor="@color/colorLightWhite"
app:cardCornerRadius="20dp"
app:cardElevation="0dp">
<RelativeLayout
android:id="@+id/layout_word_tip"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/selectableItemBackground">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:scaleType="fitXY"
android:src="@drawable/icon_forget" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="match_parent"
tools:context=".ui.home.HomeFragment">
<TextView
android:id="@+id/word"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginEnd="10dp"
android:gravity="left"
android:maxLines="1"
android:singleLine="true"
android:text="word"
android:textColor="@color/btn_blue"
android:textSize="50sp"
android:textStyle="bold"
/>
<LinearLayout
android:id="@+id/pa_layout"
android:layout_below="@+id/word"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_gravity="bottom"
android:layout_width="25dp"
android:layout_height="20dp"
android:src="@drawable/img_uk" />
<TextView
android:id="@+id/pa_UK"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:paddingLeft="10dp"
android:text="/'sent(ə)ns/"
android:paddingRight="10dp"
android:textColor="@color/pa_text"
android:textSize="15sp" />
<ImageView
android:layout_gravity="bottom"
android:layout_width="25dp"
android:layout_height="20dp"
android:src="@drawable/img_us" />
<TextView
android:id="@+id/pa_US"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginLeft="10dp"
android:text="/'sent(ə)ns/"
android:textColor="@color/pa_text"
android:textSize="15sp" />
</LinearLayout>
<androidx.cardview.widget.CardView
android:layout_marginTop="20dp"
android:layout_marginStart="20dp"
android:layout_below="@id/pa_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/transparent">
<LinearLayout
android:layout_width="100dp"
android:layout_height="50dp"/>
</androidx.cardview.widget.CardView>
<Button
android:id="@+id/word_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="40dp"
android:layout_marginBottom="20dp"
android:text="下一个" />
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="match_parent"
tools:context=".TestActivity">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询"
tools:layout_editor_absoluteX="169dp"
tools:layout_editor_absoluteY="176dp" />
<Button
android:id="@+id/btn_download"
android:layout_marginLeft="60dp"
android:layout_toRightOf="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载词书"
tools:layout_editor_absoluteX="169dp"
tools:layout_editor_absoluteY="176dp" />
<TextView
android:id="@+id/textView"
android:layout_below="@+id/button1"
android:layout_width="104dp"
android:layout_height="69dp"
android:text="TextView"
tools:layout_editor_absoluteX="58dp"
tools:layout_editor_absoluteY="96dp" />
<EditText
android:layout_below="@+id/textView"
android:id="@+id/edt2"
android:layout_marginTop="20dp"
android:hint="输入单词序号"
android:background="@drawable/btn_white"
android:layout_width="180dp"
android:layout_height="50dp"/>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="match_parent"
tools:context=".WordBook">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/book_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/book_list"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</RelativeLayout>
\ No newline at end of file
此差异已折叠。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="vertical">
<TextView
android:id="@+id/text_wd_item_phrase_en"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="internet access"
android:textColor="@color/colorLightBlack"
android:textSize="15sp" />
<TextView
android:id="@+id/text_wd_item_phrase_cn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="互联网接入"
android:textColor="@color/colorGrey"
android:textSize="13sp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toStartOf="@+id/img_wd_item_sentence_voice"
android:orientation="vertical">
<TextView
android:id="@+id/text_wd_item_sen_en"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Users can access their voice mail remotely."
android:textColor="@color/colorLightBlack"
android:textSize="15sp" />
<TextView
android:id="@+id/text_wd_item_sen_cn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="用户可以远程获取语音邮件。"
android:textColor="@color/colorGrey"
android:textSize="13sp" />
</LinearLayout>
<ImageView
android:layout_marginStart="5dp"
android:id="@+id/img_wd_item_sentence_voice"
android:layout_width="30dp"
android:layout_height="30dp"
android:padding="3dp"
android:layout_alignParentEnd="true"
android:background="?android:attr/selectableItemBackground"
android:src="@drawable/icon_voice" />
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_card_word_choice"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="20dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="10dp">
<TextView
android:id="@+id/item_text_word_means"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/item_img_word_choice_status"
android:text="n.薄片;部分;菜刀,火铲"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/colorLightRed" />
<ImageView
android:id="@+id/item_img_word_choice_status"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginStart="10dp"
android:src="@drawable/icon_wrong" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/red"
app:layout_constraintCircleRadius="24dp">
<androidx.cardview.widget.CardView
android:layout_marginTop="15dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginBottom="5dp"
android:background="@color/transparent_1"
app:cardCornerRadius="14dp"
android:layout_width="match_parent"
android:layout_height="200dp">
<LinearLayout
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/book_name"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="词书名称"
android:textSize="28sp"
android:gravity="center"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/book_image"
android:layout_width="160dp"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:scaleType="fitCenter"
android:src="@drawable/translate" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/book_introduce"
android:text="词书介绍"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:textSize="18sp"
android:textStyle="bold"
android:layout_centerVertical="true"/>
<Button
android:id="@+id/book_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="15dp"
android:layout_centerHorizontal="true"
android:text="@string/down_word_book" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册