私はAndroid.Followingで、WordNetとのインターフェースにJWIを使用しています。関連するコードは次のとおりです
ボタンクリック時
public class ODFragment extends Fragment {
...
//global vars
String searchWord = "dog";
String wordDefinition = null;
DictSearch dict;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
...
View.OnClickListener defineListener = new View.OnClickListener()
{
@Override
public void onClick(View v) { //TODO
...
//query offline dictionary
dict = new DictSearch(rootView.getContext().getAssets());
if(!dict.exists())
{
Toast.makeText(rootView.getContext(), "Dictionary files not found!", Toast.LENGTH_SHORT).show();
return;
}
else {
Toast.makeText(rootView.getContext(), "Dictionary files found!", Toast.LENGTH_SHORT).show();
wordDefinition = dict.getTopGlosses(searchWord); //FAULTY
if (wordDefinition.equals("")) {
Toast.makeText(rootView.getContext(), "No definition found", Toast.LENGTH_LONG).show();
} else {
//show in dialogue
PostCaptureDialogue postCaptureDialogue = new PostCaptureDialogue(); //use this dialogue for the time being
postCaptureDialogue.setDimensions("Definition of '" + searchWord + "': " + wordDefinition);
postCaptureDialogue.show(getFragmentManager(), "post_textual_query_dialogue");
}
}
}
};
button_define.setOnClickListener(defineListener);
return rootView;
}
...
}
DictSearch.Java
public class DictSearch {
static POS[] POS_ARR = { POS.NOUN, POS.VERB, POS.ADJECTIVE, POS.ADVERB };
StringBuffer m;
IDictionary dict;
boolean created;
AssetManager assets;
public DictSearch(AssetManager assets_param) {
created = true;
m = new StringBuffer(5000);
assets = assets_param;
buildDict();
}
private void buildDict() {
StringBuffer fpath = new StringBuffer(400);
fpath.append(Environment.getExternalStorageDirectory().toString()
+ "/odnvt_resources");
File f = new File(fpath.toString());
dict = new Dictionary(f);
try {
dict.open();
} catch (IOException e) {
e.printStackTrace();
created = false;
}
}
private String shorten(String s) {
if(s.length() == 4)
return s.substring(0, 1);
else
return s.substring(0, 3);
}
public boolean exists() {
return created;
}
public String getTopGlosses(String search_word) {
//buildDict();
int i = 1;
for (POS p : POS_ARR) {
IIndexWord idxWord = dict.getIndexWord(search_word, p); //FAULT HERE
//IIndexWord idxWord = dict.getIndexWord("dog", POS.NOUN); //dbg
if (idxWord == null)
continue;
List<IWordID> wordIDs = idxWord.getWordIDs();
IWordID wordID = wordIDs.get(0);
IWord iword = dict.getWord(wordID);
m.append(String.format(Locale.getDefault(), "%d. (%s) %s\n",
i, shorten(iword.getPOS().toString()), iword.getSynset()
.getGloss()));
++i;
}
return m.toString();
}
}
ボタンをクリックすると、次のエラーが表示されます。
エラートレース
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abdulwasae.odnvt_1, PID: 20652
edu.mit.jwi.data.IHasLifecycle$ObjectClosedException
at edu.mit.jwi.CachingDictionary.checkOpen(CachingDictionary.java:112)
at edu.mit.jwi.CachingDictionary.getIndexWord(CachingDictionary.java:191)
at com.abdulwasae.odnvt_1.DictSearch.getTopGlosses(DictSearch.java:126)
at com.abdulwasae.odnvt_1.ODFragment$2.onClick(ODFragment.java:238)
at android.view.View.performClick(View.java:4856)
at android.view.View$PerformClick.run(View.java:19956)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5373)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
私はこれを何日も調べてきました。私は今困惑しています。どんな助けでも大歓迎です。
ノート:
- XDictionary のオープンソース コードから DictSearch.java の一部を取得しました。
- 解凍した辞書ファイルの場所は次のとおりです: \app\src\main\assets\dict
- また、ファイルをどこに配置してアクセスするかについて混乱していたため、圧縮された WordNet をSDCARD0/odnvt_resources/に配置しました。
前もって感謝します