問題の声明
Android向けのオランダ語-ロシア語辞書を作成したかったのは、市場にきちんとしたものがないからです。 良い紙からスキャンした辞書に出会いました。 写真から情報を抽出するプロセスは、別の記事に値します。 したがって、この部分はスキップしてください。 最初のステップとして、htmlページの形式で辞書を作成しました。 「hello world」を作成するための指示に従って、アプリケーションを作成し、正常に開始しました。 次に、ファイルで処理し、詳細を思い出す必要がありました。
設定
window.localStorageを使用して設定を保存しました。 メインhtmlページで必要な入力フィールドを使用してダイアログを作成し、それを表示/非表示/保存するイベント ' menubutton '、 ' backbutton 'にハンドラーを掛けました。 すべてが正常に機能します。 その後、彼はそこにクエリ履歴のストレージを追加しました。
デフォルトボタンの碑文
ソフトウェアキーボードを開くと、デフォルトのボタンには「 GO 」という碑文があります。 これは、ディクショナリでの作業とあまり一貫性がありません。 フレームワークのドキュメントは、この状況をカバーしていません。 SDKのドキュメントでは 、入力フィールドのandroid:imeOptions属性の設定について説明しています。 しかし、もちろん、これはブラウザー内では機能しません。 何度か私は解決策を求めてインターネットを駆け巡りました。 最後に、iPhone用の作業バージョンに出会いました-
<input type="text" />
代わりに
<input type="text" />
<form><input type="search" /></form>
を使用する必要があります。さらに、フォーム要素が必要です。 Androidでは、フォームがなくても機能します。フォームは送信されており、この問題を防ぐ必要があるため、有害ですらあります。 したがって、
<input type="search" />
を使用すると、デフォルトのボタンは魔法のように ' Search 'に変わります。
アプリケーションを終了
この
navigator.app.exitApp()
フレームワークにはAPIがあります。 結局のところ、それは箱から出して動作しません。 これをAndroidManifest.xmlで機能させるには、
<uses-sdk android:minSdkVersion="2" />
を登録する必要があります。 新しいバージョン1.2.0では、問題はすでに修正されているため、これはアップグレードするもう1つの理由です。
クリップボードから転送
リーダー( CoolReader )には、バッファーへの単語のコピーがあります。 したがって、辞書を呼び出すときに不要なジェスチャーを行わずに、すぐに翻訳を受け取るために、クリップボードにアクセスしたいと思いました。 デフォルトでは、これは不可能ですが、プラットフォームはプラグインによって簡単に拡張できます。 バッファを操作するためのAPIを提供するプラグインを見つけました。 バンドルは他の束(27個) -phonegap-pluginsであることが判明しました。 ご覧ください、あなたはそれを後悔しません。
プロセスは次のようになりました-2回タップした(バッファ内の単語)、タスクマネージャー(ロングタップ)を呼び出し、辞書(別のタップ)とopaを選択した、なじみのない単語を見ました-翻訳はすでにここにあります。 私はキャンセルをクリックしました-そして再びリーダーで。
自動通話と転送
しかし、完璧に制限はありません。 体の動きをもっと少なくしたかった。 リーダーには、Fora DictionaryとColorDictを呼び出す2つの方法の2つの辞書が統合されています。 リーダーのソースをダウンロードしました。それらは開いているので、呼び出しの様子を確認しました。 残念ながら、両方の辞書は保護されていますが、それらは標準的な方法で呼び出され、構成できます。 そのため、たとえばハンディキャップのふりをする考えが生まれました。 SDKドキュメントからのこの命令は、目的の検索インターフェイスを実装し、検索用に送信された文字列を受信し、URLでパラメーターを渡すのに十分です。 標準のonCreate実装は次のようになり始めました。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); String url = "file:///android_asset/www/index.html"; if (Intent.ACTION_SEARCH.equals(intent.getAction())) { url += "?search=" + intent.getStringExtra(SearchManager.QUERY); } super.loadUrl(url); }
ただし、このコードは、アプリケーションの作成時に検索文字列のみを渡します。 アプリケーションがすでにバックグラウンドにあるときに検索バーを取得するには、標準Javaコードに別のメソッドを追加する必要がありました。
@Override protected void onResume() { super.onResume(); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String sQuery = intent.getStringExtra(SearchManager.QUERY); this.appView.loadUrl( "javascript:try{PhoneGap.fireDocumentEvent('search', {detail: '" + sQuery + "'});}catch(e){};" ); } }
コードは、javascriptの新しい「 検索 」イベントを生成し、必要なデータを渡します。 PhoneGapのソースコードで見張る独自のイベントを作成する方法。
読者に有利なスタートの原因を考えさせるには、クラスの名前を変更する必要がありました。 目的の名前は、リーダーのソースコードでスパイされていました。 もちろん、これは完全に正しいわけではありませんが、個人使用の場合はそうなります。
これで辞書の使用が理想的になりました-読者になじみのないダブルワードの単語を見ました-辞書は翻訳を示し、キャンセルを押しました-再び。
画面の向きを変更するとアプリケーションがクラッシュする
検索インターフェイスを追加し、新しいプロジェクトにクラスの名前を変更した後、アプリケーションは、「フォーカスされたビューにIDがないため、どのビューにフォーカスがあるかを保存できませんでした」というエラーで向きを変えると抜け始めました。 検索でこの問題が発生していることが示されたため、これがどのように解決されたかについて言及します。 決定的なことが判明したが、私は理解していませんでした。 新しいプロジェクトを作成するときに、 AndroidManifest.xmlをスキップしました
-ルートマニフェスト要素内:
<supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:resizeable="true" android:anyDensity="true" />
- アプリケーション要素でアクティビティを作成しませんでした:
<activity android:name="com.phonegap.DroidGap" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"> <intent-filter></intent-filter> </activity>
すべてのアクティビティには、
android:configChanges="orientation|keyboardHidden"
属性
android:configChanges="orientation|keyboardHidden"
です。 もちろん自分でやった 「hello world」ではこれがすべてです。 注意してください。
アプリケーションのサイズは非常に控えめであることが判明しました-186k(辞書データを含まない)。 最初はPhoneGapの後に標準プロセスに従ってすべてを行うというアイデアがありましたが、 結果は100%満足で、この点はもうわかりません。
脅威。 ソースコード付きのCool ReaderのVadim Lopatin、ソースコード付きの手頃なプラットフォームのPhoneGapの作成者、ソート付きプラグインの作成者、ソースへのアクセス用のgithub、および鉱山を維持するためのビットパックのおかげです。