public class UnknownWordActivity extends AppCompatActivity {
ArrayList<String> unknownWordData;
ArrayList<JSONObject> unknownWordJsonData;
ListView unknownListView;
@Override
protected void onPostResume()
{
super.onPostResume();
getDelegate().onPostResume();
unknownWordData=new ArrayList<>();
unknownWordJsonData=new ArrayList<>();
SharedPreferences h=getSharedPreferences("data",MODE_PRIVATE);
try
{
JSONArray jsonArray = new JSONArray(h.getString("unknownWordTag", "[]"));
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject o=jsonArray.getJSONObject(i);
unknownWordJsonData.add(o);
unknownWordData.add(o.getString("wordName"));
}
wordListAdapter ad=new wordListAdapter(UnknownWordActivity.this, R.layout.historylistlayout,unknownWordData);
unknownListView.setAdapter(ad);
}
catch (JSONException ex)
{
ex.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_unkonw_word);
unknownListView=(ListView)findViewById(R.id.unknownWordListView);
unknownListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
try
{
Word word= new Word();
JSONObject contentJson = unknownWordJsonData.get(position);
int status = contentJson.getInt("status");
word.setStatus(status);
if (status==1)
{
word.setOut(contentJson.getString("out"));
}
else
{
JSONArray wordMeanJsonArray = new JSONArray(contentJson.getString("wordMean"));
List<String> wordMeanList=new ArrayList<>();
for (int i=0;i<wordMeanJsonArray.length();i++)
{
wordMeanList.add(wordMeanJsonArray.getString(i));
}
word.setWordMean(wordMeanList);
word.setPhTtsMp3(contentJson.getString("phTtsMp3"));
}
word.setWordName(unknownWordData.get(position));
Intent intent = new Intent();
intent.setClass(UnknownWordActivity.this, vocabularyActivity.class);
Bundle bundle=new Bundle();
bundle.putSerializable("word",word);
intent.putExtras(bundle);
UnknownWordActivity.this.startActivity(intent);
}
catch (JSONException e)
{
e.printStackTrace();
}
}
});
}
}
-------------------------------------------
public class vocabularyActivity extends AppCompatActivity {
static String unknownWordTag="unknownWordTag";
int state;
private Word word;
private TextView wordTextView;
private TextView meanTextView;
private Button soundButton;
private MediaPlayer mediaPlayer;
Button addOrRemoveWordButton;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vocabulary);
wordTextView=(TextView)findViewById(R.id.wordTextView);
meanTextView=(TextView)findViewById(R.id.meanTextView);
soundButton=(Button) findViewById(R.id.soundButton);
mediaPlayer = new MediaPlayer();
addOrRemoveWordButton=(Button)findViewById(R.id.addOrRemoveWordButton);
setUp();
setAddOrRemoveWordButton();
}
void setAddOrRemoveWordButton()
{
SharedPreferences h=getSharedPreferences("data",MODE_PRIVATE);
try {
JSONArray jsonArray = new JSONArray(h.getString(unknownWordTag, "[]"));
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject JO=jsonArray.getJSONObject(i);
String wordName=JO.getString("wordName");
if (wordName.equals(word.getWordName()))
{
addOrRemoveWordButton.setText("从生词本中移除");
state=1;
}
else
{
addOrRemoveWordButton.setText("加入生词本");
state=0;
}
}
}
catch (JSONException ex)
{
ex.printStackTrace();
}
addOrRemoveWordButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
SharedPreferences h=getSharedPreferences("data",MODE_PRIVATE);
SharedPreferences.Editor e=h.edit();
try {
JSONObject o = new JSONObject();
o.put("status", word.getStatus());
if (word.getStatus() == 1) {
o.put("wordName", word.getWordName());
o.put("out", word.getOut());
} else {
o.put("wordName", word.getWordName());
o.put("phTtsMp3", word.getPhTtsMp3());
JSONArray a = new JSONArray(word.getWordMean());
o.put("wordMean", a.toString());
}
JSONArray jsonArray = new JSONArray(h.getString(unknownWordTag,"[]"));
if (state==0)
{
jsonArray.put(o);
e.putString(unknownWordTag,jsonArray.toString());
addOrRemoveWordButton.setText("从生词本中移除");
state=1;
}
else
{
for (int i=0;i<jsonArray.length();i++)
{
JSONObject p=jsonArray.getJSONObject(i);
if ( p.getString("wordName").equals(word.getWordName()))
{
jsonArray.remove(i);
break;
}
}
e.putString(unknownWordTag,jsonArray.toString());
addOrRemoveWordButton.setText("加入生词本");
state=0;
}
e.commit();
}catch (JSONException ex)
{
ex.printStackTrace();
}
}
});
}
void setUp()
{
word = (Word) getIntent().getSerializableExtra("word");
wordTextView.setText(word.getWordName());
try
{
if (word.getStatus()==0)
{
List<String> meanList=word.getWordMean();
String meanText="";
for (int i=0;i<meanList.size();i++)
{
meanText+=meanList.get(i)+"\n";
}
meanTextView.setText(meanText);
if (isNetworkConnected(vocabularyActivity.this.getApplicationContext()))
{
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(word.getPhTtsMp3());
mediaPlayer.prepare();
soundButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
if (!mediaPlayer.isPlaying())
{
mediaPlayer.start();
}
}
});
}
else
{
soundButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Toast.makeText(vocabularyActivity.this,"当前网络不可用",0).show();
}
});
}
}
else
{
soundButton.setAlpha(0);
String out=word.getOut();
out=out.replace("<br/>","");
if (out.equals(word.getWordName()))
{
meanTextView.setText("没有该词的解释");
}
else
{
meanTextView.setText(out);
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
public boolean isNetworkConnected(Context context)
{
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
}
--------------------------------------------------------------
public class wordListAdapter extends ArrayAdapter<String>
{
private int resourceID;
public wordListAdapter(Context context, int resource , List<String> objects)
{
super(context, resource,objects);
resourceID=resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
String HistoryWord=getItem(position);
View view= LayoutInflater.from(getContext()).inflate(resourceID,null);
TextView wordName=(TextView)view.findViewById(R.id.wordListTextView);
wordName.setText(HistoryWord);
return view;
}
}
----------------------------------------------------------
import com.victor.loading.rotate.RotateLoading;
public class MainActivity extends AppCompatActivity
{
static String searchHistoryTag;
ArrayList<String> historyData;
ListView historyListView;
EditText searchEditText;
Button searchButton;
RotateLoading loading;
@Override
protected void onStart() {
super.onStart();
getDelegate().onStart();
loadSearchWord();
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loading= findViewById(R.id.rotateloading);
historyData=new ArrayList<>();
searchEditText=(EditText)findViewById(R.id.searchEditText);
historyListView=(ListView)findViewById(R.id.historyListView);
searchButton=(Button)findViewById(R.id.searchButton);
historyListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
searchEditText.setText(historyData.get(position));
if (isNetworkConnected(MainActivity.this.getApplicationContext()))
{
loading.start();
new Thread(networkTask).start();
}
else
{
Toast.makeText(MainActivity.this,"当前网络不可用",0).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
public void search(View view)
{
if (isNetworkConnected(MainActivity.this.getApplicationContext()))
{
historyListView.setClickable(false);
searchButton.setClickable(false);
String w=searchEditText.getText().toString().replace(" ","");
if (!w.equals(""))
{
new Thread(networkTask).start();
loading.start();
}
}
else
{
Toast.makeText(MainActivity.this,"当前网络不可用",0).show();
}
}
Runnable networkTask = new Runnable() {
@Override
public void run()
{
postSearch();
}
};
private void postSearch()
{
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
try {
String wordName=searchEditText.getText()+"";
URL url = new URL("http://fy.iciba.com/ajax.php?a=fy");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setRequestMethod("POST");
String data = "f=auto&t=auto&w="+wordName;
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setDoOutput(true);
OutputStream outputStream = connection.getOutputStream();
outputStream.write(data.getBytes());
int responseCode = connection.getResponseCode();
if(responseCode ==200){
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
Word word=jsonDecode(sbf.toString(),wordName);
recordSearchWord(wordName);
Intent intent = new Intent();
intent.setClass(MainActivity.this, vocabularyActivity.class);
Bundle bundle=new Bundle();
bundle.putSerializable("word",word);
intent.putExtras(bundle);
MainActivity.this.startActivity(intent);
}
else
{
mHandler.sendEmptyMessage(1);
return;
}
} catch (MalformedURLException e)
{
e.printStackTrace();
} catch (ProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
mHandler.sendEmptyMessage(0);
}
private Handler mHandler = new Handler() {
public void handleMessage (Message msg) {//此方法在ui线程运行
switch(msg.what)
{
case 0:
loading.stop();
searchButton.setClickable(true);
historyListView.setClickable(true);
break;
case 1:
Toast.makeText(MainActivity.this,"无法搜索",0).show();
break;
}
}
};
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId()) {
case R.id.UnknownWord:
Intent intent = new Intent();
intent.setClass(MainActivity.this, UnknownWordActivity.class);
MainActivity.this.startActivity(intent);
break;
case R.id.clearHistory:
SharedPreferences h=getSharedPreferences("data",MODE_PRIVATE);
SharedPreferences.Editor e=h.edit();
e.remove(searchHistoryTag);
e.commit();
loadSearchWord();
break;
}
return true;
}
private Word jsonDecode(String json,String wordName)
{
Word word = new Word();
try {
JSONObject jsonObject = new JSONObject(json);
int status = jsonObject.getInt("status");
JSONObject contentJson = jsonObject.getJSONObject("content");
word.setStatus(status);
if (status==1)
{
word.setOut(contentJson.getString("out"));
}
else
{
JSONArray wordMeanJsonArray = contentJson.getJSONArray("word_mean");
List<String> wordMeanList=new ArrayList<>();
for (int i=0;i<wordMeanJsonArray.length();i++)
{
wordMeanList.add(wordMeanJsonArray.getString(i));
}
word.setWordMean(wordMeanList);
word.setPhTtsMp3(contentJson.getString("ph_tts_mp3"));
}
word.setWordName(wordName);
return word;
}
catch (JSONException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
return word;
}
private void loadSearchWord()
{
historyData.clear();
SharedPreferences h=getSharedPreferences("data",MODE_PRIVATE);
try {
JSONArray jsonArray = new JSONArray(h.getString(searchHistoryTag,"[]"));
for (int i = 0; i < jsonArray.length(); i++) {
historyData.add(jsonArray.getString(i));
}
wordListAdapter ad=new wordListAdapter(MainActivity.this,R.layout.historylistlayout,historyData);
historyListView.setAdapter(ad);
} catch (Exception e) {
e.printStackTrace();
}
}
private void recordSearchWord(String searchWord)
{
historyData.clear();
SharedPreferences h=getSharedPreferences("data",MODE_PRIVATE);
SharedPreferences.Editor e=h.edit();
try
{
JSONArray jsonArray = new JSONArray(h.getString(searchHistoryTag,"[]"));
for (int i = 0; i < jsonArray.length(); i++)
{
historyData.add(jsonArray.getString(i));
}
for (int i=0;i<historyData.size();i++)
{
if (historyData.get(i).equals(searchWord))
{
historyData.remove(i);
break;
}
}
historyData.add(0,searchWord);
JSONArray newJsonArray = new JSONArray(historyData);
e.putString(searchHistoryTag,newJsonArray.toString());
e.commit();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public boolean isNetworkConnected(Context context)
{
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
}
---------------------------------
public class Word implements Serializable
{
private String out;
private String wordName;
private int status;
private String phTtsMp3;
private List<String> wordMean;
public void setOut(String out)
{
this.out = out;
}
public String getOut() {
return out;
}
public void setWordName(String wordName)
{
this.wordName = wordName;
}
public String getWordName() {
return wordName;
}
public void setStatus(int status)
{
this.status = status;
}
public int getStatus() {
return status;
}
public void setPhTtsMp3(String phTtsMp3) {
this.phTtsMp3 = phTtsMp3;
}
public String getPhTtsMp3() {
return phTtsMp3;
}
public void setWordMean(List<String> wordMean) {
this.wordMean = wordMean;
}
public List<String> getWordMean() {
return wordMean;
}
}
---------------------------------------------
activity_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:layout_toLeftOf="@+id/searchButton"
android:layout_marginRight="0dp"
android:hint="输入单词或句子"
android:id="@+id/searchEditText"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" />
<Button
android:id="@+id/searchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="0dp"
android:text="搜索"
android:layout_alignParentRight="true"
android:layout_centerHorizontal="true"
android:onClick="search"/>
</RelativeLayout>
<TextView
android:text="历史记录"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView2" />
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/historyListView"/>
</LinearLayout>
<com.victor.loading.rotate.RotateLoading
android:id="@+id/rotateloading"
android:layout_width="80dp"
android:layout_height="80dp"
app:loading_width="5dp"
app:loading_color="#2522e6"
android:layout_centerInParent="true"/>
</RelativeLayout>
-------------------------------
activity_nukonw_word
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_unkonw_word"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<ListView
android:id="@+id/unknownWordListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
/>
</LinearLayout>
----------------------------------------------------------
activity_vocabulary
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_vocabulary"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/wordTextView"
android:textSize="24sp" />
<Button
android:text=" "
android:layout_width="20dp"
android:layout_height="20dp"
android:id="@+id/soundButton"
android:textSize="10sp"
android:layout_marginLeft="10dp"
android:layout_gravity="center_vertical"
android:background="@drawable/sound"/>
</LinearLayout>
<TextView
android:text="TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/meanTextView"
/>
<Button
android:text="加入生词本"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/addOrRemoveWordButton"
/>
</LinearLayout>
-------------------------------------------------------------
historylistlayout
<?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">
<TextView
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:id="@+id/wordListTextView"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:textSize="18sp" />
</LinearLayout>
-----------------------------------------------------------
menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group android:id="@+id/group2" >
<item
android:id="@+id/UnknownWord"
android:title="生词本">
</item>
<item
android:id="@+id/clearHistory"
android:title="删除所有历史记录">
</item>
</group>
</menu>
dimen.xml
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
依赖
compile 'com.victor:lib:1.0.4'
本文深入解析了一款生词管理应用的实现细节,包括生词的存储、检索、展示及生词本的增删功能。文章详细介绍了如何使用JSON进行数据存储,如何通过ListView展示生词列表,并实现了生词的点击跳转功能。此外,还涵盖了如何通过SharedPreferences存储和读取数据,以及如何在不同活动间传递数据。
5982

被折叠的 条评论
为什么被折叠?



