下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 05:自定义词库

05:自定义词库.doc

05:自定义词库

xufo3ie
2018-09-10 0人阅读 举报 0 0 暂无简介

简介:本文档为《05:自定义词库doc》,可适用于IT/计算机领域

android输入法:openwnn源码解析用户自定义词库分类:andriod:人阅读评论()收藏举报本文是openwnn源码解析的第篇主要是介绍openwnn日文输入法的自定义词库功能。     最近看到网上有转载我的文章但没有注明出处。由于这是系列文章单单转载一两篇读者也不一定看得懂。因此在这里做一个标记如果看到转载的同学可以访问我的博客http:blogcsdnnetxianming。    用户自定义词库包含UserDictionaryToolsEditjavaUserDictionaryToolsListjavaUserDictionaryToolsListFocusjavaUserDictionaryToolsListJAJPjavaUserDictionaryToolsEditJAJPjavaClearLearnDictionaryDialogPreferenceJAJPjavaClearUserDictionaryDialogPreferenceJAJPjava这些类。    用户可以进入输入法设置界面其中关于自定义词库部分:    其中日语用户词典与英语用户词典实现起来是一样的。而“学习词典初始化”只是将用户的学习词典清空也是比较简单的。、涉及的类    这里涉及个类UserDictionaryToolsEditjavaUserDictionaryToolsListjavaUserDictionaryToolsListFocusjavaUserDictionaryToolsListJAJPjavaUserDictionaryToolsEditJAJPjava其中最关键的是UserDictionaryToolsEditjavaUserDictionaryToolsListjava而UserDictionaryToolsEditJAJPjavaUserDictionaryToolsListJAJPjava则分别继承前面两个类其重载了几个方法主要是为了做不同输入法的配置工作。    比如UserDictionaryToolsListJAJP类代码:java viewplainHYPERLINK"http:blogcsdnnetxianmingarticledetails"o"copy"copy**  * The user dictionary tool class for Japanese IME  *  * author Copyright (C)  OMRON SOFTWARE CO, LTD  All Rights Reserved  *  public class UserDictionaryToolsListJAJP extends UserDictionaryToolsList {      **      * Constructor      *      public UserDictionaryToolsListJAJP() {          mListViewName = "jpcoomronsoftopenwnnJAJPUserDictionaryToolsListJAJP"          mEditViewName = "jpcoomronsoftopenwnnJAJPUserDictionaryToolsEditJAJP"          mPackageName  = "jpcoomronsoftopenwnn"      }        ** see jpcoomronsoftopenwnnUserDictionaryToolsList#headerCreate *      Override protected void headerCreate() {        getWindow()setFeatureInt(WindowFEATURECUSTOMTITLE,                Rlayoutuserdictionarytoolslistheaderja)      }        ** see jpcoomronsoftopenwnnUserDictionaryToolsList#createUserDictionaryToolsEdit *      Override protected UserDictionaryToolsEdit createUserDictionaryToolsEdit(View view, View view) {          return new UserDictionaryToolsEditJAJP(view, view)      }        ** see jpcoomronsoftopenwnnUserDictionaryToolsList#sendEventToIME *      Override protected boolean sendEventToIME(OpenWnnEvent ev) {          try {              return OpenWnnJAJPgetInstance()onEvent(ev)          } catch (Exception ex) {              * do nothing if an error occurs *          }          return false      }    }      从这个代码我们可以看到这个类只是做了一些适配性的工作比较简单。、UserDictionaryToolsListjava    其界面类似如下:    点击其中的“add”按钮则弹出如下添加对话框(实际上是个activity):    从上面的这两个界面我们可以看出这个类有很大一部分代码是用来生成并处理menu的这一部分代码就不介绍了。    我们以删除对话框中的删除词条功能来介绍一下这里面比较特别的地方:java viewplainHYPERLINK"http:blogcsdnnetxianmingarticledetails"o"copy"copy**      * Process the event when the button on the "Delete word" dialog is pushed      *      * param  dialog    The information of the dialog      * param  button    The button that is pushed      *      private DialogInterfaceOnClickListener mDialogDeleteWords =          new DialogInterfaceOnClickListener() {              public void onClick(DialogInterface dialog, int button) {                    CharSequence focusString = ((TextView)sFocusingView)getText()                  CharSequence focusPairString = ((TextView)sFocusingPairView)getText()                  WnnWord wnnWordSearch = new WnnWord()                if (mSelectedViewID > MAXWORDCOUNT) {                      wnnWordSearchstroke = focusPairStringtoString()                      wnnWordSearchcandidate = focusStringtoString()                  } else {                      wnnWordSearchstroke = focusStringtoString()                      wnnWordSearchcandidate = focusPairStringtoString()                  }                  boolean deleted = deleteWord(wnnWordSearch)                  if (deleted) {                      ToastmakeText(getApplicationContext(),                                     Rstringuserdictionarydeletecomplete,                                     ToastLENGTHLONG)show()                  } else {                      ToastmakeText(getApplicationContext(),                                     Rstringuserdictionarydeletefail,                                     ToastLENGTHLONG)show()                  return                  }                     int id = mSelectedViewID              id = (MAXWORDCOUNT < id)  id  MAXWORDCOUNT : id                  View v =                     mTableLayoutremoveView((View)sFocusingViewgetParent())                  sFocusingView的ViewParent是一个row                    拥有焦点的词条被删除以后先从被删词条下面开始找若有则下面的按个词条获得焦点否则被删词条上面的词条获得焦点                  for (int i = id i < MAXWORDCOUNT i) {                      v = mTableLayoutfindViewById(i)                      if (v != ) {                          break                      }                  }                    if (v == ) {                      for (int i = id  <= i i) {                          v = mTableLayoutfindViewById(i)                          if (v != ) {                              break                          }                      }                  }                                if (v != ) {                      ((View)vgetParent())requestFocus()                  }                  mWordCount                    TextView leftText = (TextView) findViewById(Riduserdictionarytoolslisttitlewordscount)                  leftTextsetText(mWordCount  ""  MAXWORDCOUNT)                    if (mInitializedMenu) {                      onCreateOptionsMenu(mMenu)                  }              }          }            这里程序的关键点我加了中文注释大家看看应该就明白了。    另外程序中用到了一个小技巧就是在一个row里面本来有两个TextView的一个是Read(读音)一个是Candidate(候选词)。正常情况下我们找到Read还需要去找Candidate。程序使用了UserDictionaryToolsListFocus这个类重定义了TextView。其目的是使得你找到了Read就可以通过UserDictionaryToolsListFocus类的mPairView找到Candidate反之亦然。    当然又个问题差点漏了。大家看这一段事件处理程序:java viewplainHYPERLINK"http:blogcsdnnetxianmingarticledetails"o"copy"copy** see androidappActivity#onKeyUp       * 这里表示按下了手机硬键盘中的中间键      **      Override public boolean onKeyUp(int keyCode, KeyEvent event) {          * open the menu if KEYCODEDPADCENTER is pressed *          if (keyCode == KeyEventKEYCODEDPADCENTER) {              openOptionsMenu()              return true          }          return false      }       这里你如果在用输入法时按模拟器的那个中间键(他的旁边是前后左右四个键)则会弹出菜单跟按“menu”键效果是一样的。、UserDictionaryToolsEditjava    这里实际上就是一个编辑框技术实现上是比较简单的。    不管是添加词条还是修改词条用的都是这个界面因此它需要判断当前是添加还是编辑如果是编辑需要初始化数据。在onCreate函数中有如下代码:java viewplainHYPERLINK"http:blogcsdnnetxianmingarticledetails"o"copy"copy* get the request and do it *          Intent intent = getIntent()          String action = intentgetAction()          if (actionequals(IntentACTIONINSERT)) {              * add a word *              mEntryButtonsetEnabled(false)              mRequestState = STATEINSERT          } else if (actionequals(IntentACTIONEDIT)) {              * edit a word *              mEntryButtonsetEnabled(true)              mReadEditTextsetText(((TextView)sFocusingView)getText())              mCandidateEditTextsetText(((TextView)sFocusingPairView)getText())              mRequestState = STATEEDIT                * save the word's information before this edit *              mBeforeEditWnnWord = new WnnWord()              mBeforeEditWnnWordstroke = ((TextView)sFocusingView)getText()toString()              mBeforeEditWnnWordcandidate = ((TextView)sFocusingPairView)getText()toString()          } else {              * finish if it is unknown request *              Loge("OpenWnn", "onCreate() : Invaled Get Intent ID="  intent)              finish()              return          }      这个是根据action的类型来判断是添加还是编辑。    其他的代码都比较简单应该看得懂。、清空词典    这里涉及到清空用户学习词典和用户自定义词典。    以清空用户学习词典为例子这里是重定义了一个DialogPreference用户选择确认了以后给OpenWnnJAJP发送一个事件。代码如下:java viewplainHYPERLINK"http:blogcsdnnetxianmingarticledetails"o"copy"copy** see androidpreferenceDialogPreference#onDialogClosed *    Override protected void onDialogClosed(boolean positiveResult) {        if (positiveResult) {            * clear the learning dictionary *            OpenWnnEvent ev = new OpenWnnEvent(OpenWnnEventINITIALIZELEARNINGDICTIONARY, new WnnWord())            OpenWnnJAJPgetInstance()onEvent(ev)              * show the message *            ToastmakeText(mContextgetApplicationContext(), Rstringdialogclearlearningdictionarydone,                           ToastLENGTHLONG)show()        }    }  、其他    这一部分代码比较简单所以就做了个简单介绍。    另外对于事件处理部分特别是OpenWnnEvent部分没有介绍等着后续吧。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/8

05:自定义词库

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利