質問
いくつかの記事を読んで、ソフトキーはデバイス間で異なることを教えてくれました。左ソフトキーで-6または-21、右ソフトキーで-7または-22と言う人もいます。この状況を考えると、適切に処理するための優れたラッパーや機能、またはベストプラクティスはありますか?
すべてのデバイスで不可能な場合、ほとんどのデバイスをサポートする最良の方法は何ですか?マイナーでは、またはハックがまったくありませんか?
解決
問題の範囲を感じるためにこれを見てください テーブル キーコードの。
Omermuhammedのアプローチは、ターゲットハンドセットに応じてJADコンテンツを変更できる場合、たとえば、オンハンドセットWebブラウザーからのダウンロードリクエストでユーザーエージェントヘッダーフィールドを調べることで、適切なアプローチです。
アプリが配信されるまでハンドセットを識別できない場合は、次のようなものを見ることができます これ それは基本的に実行時にホストハンドセットを決定し、キーコードマッピングを適切に設定します。でも私には面倒に見えます。
最後に、アプリケーションがコードのサブセットを使用している場合 五月 ハードコーディングされたリストで逃げることができます - 一部のコードでは、衝突はありません(通常、左は-3または-61であり、これらのコードは通常何かを意味しません)。繰り返しますが、理想的なアプローチではありません。
あなたのための最終的な提案されたリソース: wurfl またはユーザーエージェント文字列、および j2mepolish デバイスキーコードのデバイスデータベース。
他のヒント
私が見つけた最も簡単な方法は、ITU-T標準に基づいて推奨される値を使用してコードでセットアップし、JADパラメーターでオーバーライドすることでした。したがって、特定のアプリでは、アプリ起動時にJADパラメーターの存在を探して設定します。そうしないと、デフォルト値を使用します。
私はこれらの手法や同様の手法を使用して、迅速に移植できるアプリを作成しましたが、このプロセスは一般的によく知られています。
上記のMartin Claytonに完全に反対する必要があります。 この方法 実行時にホストハンドセットを識別することは、この問題に対処するための正しい方法です。そして、あなたのためにこれを行うための1つの標準クラスを含めることは、複数のJad/Jars IMOを囲むよりもはるかに面倒ではありません。
これは私が作成した方法であり、キーコードとキー名を使用します。私は約10年前にこのコードを書きましたが、当時はほとんどのデバイスをサポートしていました。 (しかし、私が見つけた例外の1つは、 -6
と -7
キーは逆の方向にコードします!しかし、おそらくキー名を再度使用して回避することもできますが、ユーザーエージェントも取得する必要があるかもしれません。)
private static final int SOFT_BUTTON_KEY_CODE_UNDEFINED = -999;
private static int LEFT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private static int RIGHT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private boolean isLeftSoftButton(int keyCode) {
// Try the standard code
if (keyCode == -6) {
return true;
}
// Try the code we have already detected
else if (keyCode == LEFT_SOFT_BUTTON_KEY_CODE && LEFT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (LEFT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT1") || keyName.equals("LEFT SELECTION KEY") || keyName.equals("LEFT SOFTKEY") || keyName.equals("LEFT SOFT KEY") || keyName.equals("SOFTKEY 1") || keyName.equals("-6")) {
// It's the left soft button! So remember the code for next time...
LEFT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}
private boolean isRightSoftButton(int keyCode) {
// Try the standard code
if (keyCode == -7) {
return true;
}
// Try the code we have already detected
else if (keyCode == RIGHT_SOFT_BUTTON_KEY_CODE && RIGHT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (RIGHT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT2") || keyName.equals("RIGHT SELECTION KEY") || keyName.equals("RIGHT SOFTKEY") || keyName.equals("RIGHT SOFT KEY") || keyName.equals("SOFTKEY 4") || keyName.equals("SOFTKEY 2") || keyName.equals("-7")) {
// It's the right soft button! So remember the code for next time...
RIGHT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}
に基づいて、更新されたコード http://www.iteye.com/topic/179073 ...
private static final int SOFT_BUTTON_KEY_CODE_UNDEFINED = -999;
private static int LEFT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private static int RIGHT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private boolean isLeftSoftButton(int keyCode) {
// Try the standard codes
// standard || Motorola || Siemens || Motorola 2 || Motorola 1
if (keyCode == -6 || keyCode == -21 || keyCode == -1 || keyCode == -20 || keyCode == 21) {
return true;
}
// Try the code we have already detected
else if (keyCode == LEFT_SOFT_BUTTON_KEY_CODE && LEFT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (LEFT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT1") || keyName.equals("LEFT SELECTION KEY") || keyName.equals("LEFT SOFTKEY") || keyName.equals("LEFT SOFT KEY") || keyName.equals("SOFTKEY 1") || keyName.equals("-6")) {
// It's the left soft button! So remember the code for next time...
LEFT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}
private boolean isRightSoftButton(int keyCode) {
// Try the standard codes
// standard || Motorola || Siemens || Motorola 1
if (keyCode == -7 || keyCode == -22 || keyCode == -4 || keyCode == 22) {
return true;
}
// Try the code we have already detected
else if (keyCode == RIGHT_SOFT_BUTTON_KEY_CODE && RIGHT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (RIGHT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT2") || keyName.equals("RIGHT SELECTION KEY") || keyName.equals("RIGHT SOFTKEY") || keyName.equals("RIGHT SOFT KEY") || keyName.equals("SOFTKEY 4") || keyName.equals("SOFTKEY 2") || keyName.equals("-7")) {
// It's the right soft button! So remember the code for next time...
RIGHT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}`
MIDPは、標準のITU-Tキーパッドのキーの次の定数を定義します:key_num0、key_num1、key_num2、key_num3、key_num4、key_num5、key_num6、key_num7、key_num8、key_num9、key_pound、key_star。アプリケーションは、追加のキーコードの存在に依存してはなりません。特に、キーを複数回押して生成される上限と小文字または文字は、低レベルのキーイベントではサポートされていません。キーに割り当てられた「名前」は、getKeyname()メソッドを使用して照会できます。
afair getkeynameメソッドはほとんどの携帯電話でまったく同じように返されたので、非常に信頼できましたが、約2年前からJ2MEで何も書いていないので、私の記憶はトリックをプレイするかもしれません(あなたは警告されています)