0

私は次の回避策を使用してアクティビティラベルを中央に配置しています(XMLレイアウトのカスタムタイトルに頼る必要はありません)。

((TextView)((FrameLayout)((LinearLayout)((ViewGroup) getWindow().getDecorView()).getChildAt(0)).getChildAt(0)).getChildAt(0)).setGravity(Gravity.CENTER);

これはうまく機能しますが、時々私は(Google Playの)ユーザーの1人が

java.lang.ClassCastException:com.android.internal.widget.ActionBarViewをandroid.widget.TextViewにキャストできません

これらは、Android3.x以降を実行しているタブレットユーザーである可能性があります。

アクティビティラベルに直接アクセスできる独自のカスタムタイトルを実装する以外に、 ClassCastExceptionにそれActionBarViewを回避する別の方法をお勧めできますか?TextView

おそらく、アプリが現在実行されているAndroidバージョンを確認し、別のレベルを通過しgetChildAt(0)ますか?

4

2 に答える 2

1

アクションバーはテーマで定義されます。したがって、これまでに表示されないようにする場合は、別のテーマを選択する必要があります。

または、ユーザーが使用しているOSのバージョンを検出することもできます。11(Honeycomb)以上の場合は、アクションバーをスキップして次のビューを表示します。

これは次のようになります

if (Integer.valueOf(android.os.Build.VERSION.SDK) > 11)
{
    ((TextView)((FrameLayout)((LinearLayout)((ViewGroup).getWindow().getDecorView()).getChildAt(1)).getChildAt(0)).getChildAt(0)).setGravity(Gravity.CENTER);
}
else
   ((TextView)((FrameLayout)((LinearLayout)((ViewGroup).getWindow().getDecorView()).getChildAt(0)).getChildAt(0)).getChildAt(0)).setGravity(Gravity.CENTER);

また、Sharkが言ったように、これは完全なハックであり、あまり堅牢なコードではないことを付け加えたいと思います。findViewById()を使用してビューを見つけ、その非常に醜いキャストをすべて回避する必要があります。あなたがその道を進み続けるならば、あなたはあなたのハックまたは私がちょうど入れたコードでさえ将来壊れることを期待することができます。

于 2012-08-16T16:04:03.903 に答える
1
((FrameLayout)((LinearLayout)((ViewGroup) getWindow().getDecorView()).getChildAt(0)).getChildAt(0)).getChildAt(0)

ここから子ビューの収集を開始し、独自のTextViewを検索します...アクションバーをスキップするだけで、とにかくハックを開始したときにそれについて気を配る必要はありません。

于 2012-08-16T16:07:20.767 に答える