1

これは非常に基本的なことですが、ネットで検索しても答えが見つからないようです。

基本的に、Horizo​​ntalFieldManager で 2 つの EditField を並べて表示する際に問題が発生します。

私が読んだことから、EditField はコンテナの最大幅を使用していると思います。これを念頭に置いて、editFields を追加して VerticalFieldManagers を分離し、これらを Horizo​​ntalFieldManager に追加するとうまくいくと思いました。以下は、これを行っているコードです。残念ながら、userName は問題なく表示されますが、パスワード フィールドは表示されません。私が間違っていることについてのアイデアはありますか?

            HorizontalFieldManager hfm = new HorizontalFieldManager(Manager.USE_ALL_WIDTH));        
    VerticalFieldManager vfmUser = new VerticalFieldManager();
    VerticalFieldManager vfmPassw = new VerticalFieldManager(;

    userName = new EditField("Username:", "", 5, EditField.FIELD_LEFT);
    password = new PasswordEditField("Pass: ", "", 5, PasswordEditField.FIELD_RIGHT);

    vfmUser.add(userName);
    vfmPassw.add(password);

    hfm.add(vfmUser);
    hfm.add(vfmPassw);
    add(hfm);
4

2 に答える 2

1

問題は、EditField が引き続きすべての幅を使用しようとするため、VerticalFieldManager も使用可能な幅全体を使用し、パスワード フィールドを効果的に押しのけることです。

このようなことを行う唯一の方法は、幅を画面の 50% に明示的に設定するクラスを作成することです。これを行うには 2 つの方法があります。EditField と PasswordEditField のサブクラスを作成するか、Horizo​​ntalFieldManager のサブクラスを作成します。前者のオプションは、異なるプラットフォーム間でより簡単で信頼性が高くなりますが、1 つではなく 2 つのクラスが必要になります。

これを行うには、EditField のサブクラスを作成し、そのlayoutメソッドを次のようにオーバーライドします。

protected void layout(int maxWidth, int maxHeight) {
    super.layout(maxWidth, maxHeight);
    this.setExtent(Display.getWidth()/2, this.getHeight());
}

PasswordEditField についても同様です。

どのように動作させたいかによっては、他のメソッドもオーバーライドする必要がある場合があります。たとえば、このコードは (私はかなり確信していますが、特にテストしていません)、余分な文字が目的の領域に収まらない場合、それらを切り捨てます。paintそれが望ましくない場合は、現在のテキストに基づいてレイアウトをオーバーライドまたは変更する必要があります。また、ストーム スクリーンを傾けるときにテストして、サイズが正しく更新されることを確認する必要があります。ほとんどの場合は機能するはずですが、画面上に特定のマネージャーの構成がある場合、レイアウト/サイズが更新されないバグがあります。

マネージャー ルートに進むことに決めた場合 (繰り返しますが、おそらくさらに多くの問題に遭遇する可能性があるため、特にお勧めしません)、Manager または Horizo​​ntalFieldManager のいずれかを拡張することをお勧めします (前者を実行する方が簡単な場合があります)。 、そのため、HFM のいくつかの癖に対処する必要はありません)、そのsublayoutメソッドをオーバーライドします。このメソッドでは、マネージャーのすべてのフィールド (この場合は、ユーザー フィールドとパスワード フィールド) に対してlayoutChildand を(この順序で) 呼び出す必要があります。setPositionChildそして、最後に を呼び出しますsetExtent。この問題については、blackberry のドキュメントを参照してください。ただし、正直なところ、blackberry カスタム マネージャーの実装方法を検索するか、SO について質問する方がよいでしょう。

そうは言っても、なぜこれをやりたいのかを再考したいかもしれません。経験上、UI が正しく表示されない携帯電話があることは保証できます。一度同様のアプローチを試みましたが、すべてのデバイスで UI の観点から機能させることができなかったため、最終的には破棄しました。さまざまな解像度があり、非常に狭いものもあれば、非常に広いものもあります。この UI を使用すると、一部のデバイスではログインが非常に窮屈になります。IMHO、他の BlackBerry アプリケーションと一貫性を保ち、ユーザー名とパスワードを別の行に置くことが望ましいでしょう。

于 2011-06-20T06:23:58.480 に答える