3

私はButton、それぞれが同じをアタッチしている複数のオブジェクトのセットを提供するインターフェースに取り組んでいますOnClickListener。上記のsがクリックされると、で指定されているように、Buttonが起動するはずです。ActivityonClick

参考までに私のコードは次のとおりです。

public class Calcs extends SherlockFragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // ...

        CalcLoader buttonListener = new CalcLoader(getActivity());
        LinearLayout buttons = (LinearLayout) v.findViewById(R.id.calculatorlist); // v is the inflated View
        for (int i = 0; i < buttons.getChildCount(); i++) {
            View b = buttons.getChildAt(i);
            if (b instanceof Button) {
                ((Button) b).setOnClickListener(buttonListener);
            }
        }

        // Test Code: Location 1
        Intent i = new Intent(getActivity(), MyCalcActivity.class);
        getActivity().startActivity(i);

        // ...
    }

    private class CalcLoader implements OnClickListener {
        private Activity mOwner;

        public CalcLoader(Activity owner) {
            mOwner = owner;

            // Test Code: Location 2
            Intent i = new Intent(mOwner, MyCalcActivity.class);
            mOwner.startActivity(i);
        }

        public void onClick(View v) {
            if (v instanceof Button) {
                // Actual Code: Location 3
                Intent i = new Intent(mOwner, MyCalcActivity.class);
                mOwner.startActivity(i);
            }
        }
    }
}

それにもかかわらず、私はいくつかの奇妙な振る舞いをしています。startActivity上記のコードでは、場所1と2のラベルが付いたいくつかのテストを配置しました。どちらの場合も、Activity正しく起動し、すべてが順調です。

ただし、作業コードを実行する必要がある場所3では、起動されたコードから奇妙な動作が発生しActivityます。

  • 最初は、Activity正常に起動されます。単一のテキストフィールドが表示され、フォーカスされ、ソフトキーボードが表示されます。正解です。
  • ここで、戻るボタンをクリックすると、キーボードが閉じます。正解です。
  • もう一度クリックすると、フィールドのフォーカスが失われます。これは起こらないはずです。代わりに、Activity閉じて前のものに戻る必要があります。
  • もう一度クリックすると、アプリ全体が閉じます(前に戻るのではなくActivity)。明らかに、これは起こらないはずです。

繰り返しになりActivityますが、ロケーション1または2から開始すると、すべてが正しく機能します。バックスタックは正しく、正しく初期スタックに戻りActivityます。

ここで何が問題になっていますか?なぜ、Activityから開始onClickすると、他の場所からは機能するのに失敗するのですか?

更新:Intentコンストラクターに保存してメソッドで再利用すると、UIスレッドからonClick開始する場合と同じグリッチの結果が生成されます。Activity

2番目の更新:テキストフィールドのフォーカスを解除しても、グリッチには影響しませんでした。戻るボタンはまだアプリを閉じていました。さらに、2.3.3エミュレーターで実行しても同じ結果になりました。ただし、奇妙なことに、2番目の戻るボタンを押した後(テキストフィールドがフォーカスを失った)、約3秒待つと、Activity閉じてメインのボタンに戻ります。

3番目の更新:テキストフィールドからフォーカスを取得する戻るボタンに対して、キーイベント(onKeyDownまたは)は発生しません。onBackPressedさらに、Activityテキストフィールドがフォーカスを失った後に操作するとActivity、同じタイプの新しいものをロードするアニメーションが表示されますが、ここにもグリッチがあります。

これは、Android 2.2(API 8)、2.3.1(API 9)、および2.3.3(API 10)で見られるOSレベルの問題のようです。Eclair(API 7)、およびAPI11以降にはこの問題はありません。この時点で、私はある種の回避策を探していると思います...

4

1 に答える 1

0

私の問題は、元の投稿で詳しく説明したことが原因ではないことが判明したので、お詫び申し上げます。

この問題は、SurfaceViewテストしていたタブとは関係のないタブのアイテムが原因で発生しました。タブとレイアウトをゼロから再構築した後(そして毎回構築した後)、ラグバックグリッチはSurfaceViewフォーカスされていないタブに存在する場合にのみ発生することを発見しました。

この問題を抱えているのは私だけではないことがようやくわかりました。

解決するには:

  • onPausemainにメソッドを作成しましたActivitySurfaceViewここでは、 usingを破棄しcontainer.removeView(..);ます。
  • onResumemainにメソッドを作成しましたActivity。ここでは、アイテムSurfaceViewのみを含む新しいXMLファイルからを膨らませて、元のに追加します。SurfaceViewcontainer
  • 最後に、を実装しandroid.view.SurfaceHolder.Callbackて、SurfaceView削除する前にサーフェスの内容を消去します。

これはAPI8〜10でのみ発生することに困惑しますが、これで解決できてうれしいです。彼らの援助を提供したすべての人に称賛を!

于 2012-07-09T21:53:10.350 に答える