問題タブ [android-custom-view]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 私のカスタムビューは、onCreateに追加された場合にのみ描画されます
下部に があり、RelativeLayout
その上に高さが異なる「GraphBar」カスタム ビューを作成しました。コードは次のとおりです。TextView
ImageView
これらの GraphBars を追加して高さを設定するとonCreate()
うまくいきますが、onClickSomething を作成するかsetBarHeight()
、作成したバーで再度呼び出すと、変更を確認する唯一の方法はビュー階層を読み込むことです。ここで、どこかに電話する必要があると言われましたrequestLayout()
。変更後以外の場所はmBarHeight
?何か助けはありますか?私はどこでも試しinvalidate()
ました。
ありがとう、アンドレア
(必要に応じて、テストを行うアクティビティとgraphbar.xmlを投稿できます)
おそらくバグであることがわかりました。回避策は、再度呼び出す必要がありますrequestLayout()
。それでも、どこに電話をかけることができるのかわかりません。
android - カスタム ImageView を追加した後の強制終了
ImageView
にカスタムを追加しようとしてmain.xml
いますが、プログラムを開始すると、強制的に終了します。
XML
:
Java
:
また、FC の後にデバッガーでプログラムを開始すると、次の リンク テキストのみが表示されます。
android - カスタムビュー用のattrs.xmlの同じ名前の属性
同じ名前の属性を共有するカスタムビューをいくつか書いています。のそれぞれの<declare-styleable>
セクションでattrs.xml
、属性に同じ名前を使用したいと思います。
myattr1
とmyattr2
はすでに定義されているというエラーが表示されます。とのformat
属性を省略する必要があることがわかりましたが、そうすると、コンソールで次のエラーが発生します。myattr1
myattr2
MyView2
これを達成する方法はありますか、おそらくある種の名前空間(推測だけ)ですか?
android - ANDROID:私のカスタムビューが完全にペイントされていません
Viewを拡張するクラスを作成しました。これはonDrawメソッドです。プログラムは迷路を作成し、高さと幅を適切に読み取るために、onDrawメソッドでそれらを呼び出す必要があるように見えました(そうでない場合は、両方に対して0が返されます)。これはすべてを台無しにしているものかもしれません。ただし、ペイントされたビューのセクションに表示される正方形の間隔に基づいて、正しい高さが得られます。
ペイントされていないように見えるビューのセクションは、コンテキストメニューのサイズとほぼ同じであり、スペアと一致しません。私はこの問題を抱えている他の人を探しましたが、他の誰もこの問題を抱えていないようです。私が知る限り、私は彼らと特に異なることは何もしていません。私が提供できる他の洞察があれば、私に知らせてください。
私はこのスタック全体のオーバーフローに慣れていないため、まだ写真を投稿できません=(したがって、私は可能な限り現象を説明しようとしました。
ありがとう!
android - XML から拡張 LinearLayout をインフレートする方法
この API8 の例を改善する方法を提案できる人はいますか? 彼らは、ビューは XML で定義できた可能性があると言っていますが、実際に行ったことは、ビューを Java でコーディングしたことです。彼らがそうしたかった理由がわかります。彼らはいくつかのメンバーを拡張 LinearLayout に追加しており、値は実行時に決定されます。
ああ、宇宙のみんなによると、レイアウト ディレクティブは XML に移行する必要があります。ただし、このアプリでは、ランタイム ロジックでテキストをそのまま設定しておくのが理にかなっています。そのため、ハイブリッド アプローチを採用しています。ビューを膨らませてから、ダイナミック テキストを入力します。それを実現する方法がわからなくて困っています。これがソースと私が試したものです。
LinearLayout には android:id="@+id/LinearLayout01" があるので、OnCreate でこれを行うことができるはずです。
しかし、追加した最小限のコンストラクターにはヒットしません。
java - Androidアプリ全体で使用されるカスタムビューと属性
私は現在、いくつかのAndroidアプリを開発し、複数のアプリで頻繁に使用するクラスのコードベースを作成しました。このコードはすべてSubversion(svn)リポジトリにあり、各アプリは独自のリポジトリにあります。各アプリには、必要なパッケージ(com.company.android.viewsなど)のsvn:externals参照があります。これは、カスタム属性のためにRクラスをインポートする必要がある場合を除いてうまく機能します。
カスタムビューには、次のようなインポートがあります。
次のようなコードを含めることができます。
そのカスタム属性は、res / values/attrs.xmlで定義されています。
これは完全に機能しますが、これと同じビューを使用する2番目のアプリがある場合に問題が発生します。次に、インポートをに更新してimport com.company.apps.anotherapp.R
、「anotherapp」で動作し、「myapp」で機能しないようにします。一度に複数のアプリで作業する場合、これが問題になります。
私の一時的な解決策は、該当するクラスの更新をチェックインしてから、svn:externalsをその特定のリビジョンにロックすることでした。各アプリは最終的に異なるリビジョンにロックされるため、処理が速くなりますが、さまざまなクラスをアプリのリポジトリに直接コピーするよりも優れているようです。
リフレクションを使用して私が考えた他の唯一の解決策は、次のようなものです。
次に、フィールドをループして、気になるフィールドをクラス全体で使用される変数に割り当てます。ただし、これはかなり手間がかかるように思われます。特に、これを行う必要のあるいくつかのクラスについて話している場合はなおさらです。
この問題を解決するにはどうすればよいですか?com.company.apps。*。Rを動的にインポートする方法、または特定のアプリに依存しない別のRクラスを何らかの方法で生成する方法はありますか?または、私が完全に見逃した他の明白な(またはそれほど明白ではない)解決策はありますか?
android - Android: カスタム ビューをテストするには?
Android の単体テストにはいくつかの方法があります。作成したカスタム ビューをテストするのに最適な方法は何ですか?
現在、インストルメンテーション テスト ケースのアクティビティの一部としてテストしていますが、ビューだけを分離してテストしたいと考えています。
android - 複合ビューウィジェットの状態の保存
質問
XMLで定義されたウィジェットレイアウトを使用して、個々のウィジェットインスタンスのコンポーネントがすべて同じIDを持っている場合、ビューウィジェットインスタンスの状態をどのように保存しますか?
例
たとえば、NumberPicker
ウィジェットで使用されているウィジェットを取り上げます( SDKに公開されていないことにTimePicker
注意してください)。これは、 1つのインクリメントボタン、1つのデクリメントボタン、および数値を直接入力できる1NumberPicker
つのコンポーネントから拡張される3つのコンポーネントを備えたシンプルなウィジェットです。コードがこれらのウィジェットと相互作用するために、それらはすべてID(、および)を持っています。number_picker.xml
EditText
R.id.increment
R.id.decrement
R.id.timepicker_input
NumberPicker
XMLレイアウトに3つのがあり、それらに個別のID(たとえばR.id.hour
、R.id.minute
)を指定するとします。¹このレイアウトは、アクティビティのコンテンツビューに拡張されます。アクティビティの方向を変更することにしたのでActivity.onSaveInstanceState(Bundle)
、IDを持つ各ビューのビューステートを保存すると便利です(これはデフォルトの動作です)。
残念ながら、3つNumberPicker
のにはEditText
すべて同じIDを共有するがあります— R.id.timepicker_input
。したがって、アクティビティが復元されると、ビュー階層の最下位にあるのは、3つすべての状態が保持されているように見えるアクティビティです。さらに、NumberPicker
保存時にフォーカスがあったかどうかに関係なく、復元するとフォーカスが最初に移動します。
TimePicker
状態自体を個別に保存することで、この問題を回避します。残念ながら、これは多くの作業なしではカーソル位置またはフォーカスされたビューを保持しません。それがどのようにその状態を維持するのかはわかりません(そして、時間入力ダイアログですばやく遊んでいると、どういうわけかそれが可能であることが示されているようです)。
この問題を示すサンプルコードをご覧ください: https ://github.com/xxv/AndroidNumberPickerBug
¹ビュー階層では、これにより、IDに拡張されるのIDが設定LinearLayout
さNumberPicker
れます。
android - アクティビティの終了
アクティビティには、テキスト ビューとグリッド ビューという 2 種類のビューがあります。グリッド ビューにいるときに「戻る」ボタンを押すと、テキスト ビューにフォーカスを移動して機能を続行し、再びグリッド ビューにアクセスできるようにする必要があります。テキストビューで「戻る」ボタンを押すと、アクティビティを終了する必要があります。グリッドビューに .setOnKeyListener() を与えると、これを行うことができます。ただし、これを行うと、グリッド ビューのフォーカスが失われます。では、グリッド ビューを終了してテキスト ビューにするにはどうすればよいのでしょうか。
android - カスタム ビューの CastClassException
findViewById()
カスタム ビューを表示しようとすると、 ClassCastException
. 私は非常に多くのことを試したので、今ではコードを失敗したと確信しています!
私が正気を失っていないことを確認するために、何が間違っているのかを見つけるために、クラスを最小限に減らしました。
私はアンドロイドプログラミングが初めてで、基本的なものが欠けていると確信しています。
これはBaseImageView
拡張ビュー クラスです。
これはクラスLiveImageView
の拡張です。BaseImageView
これがレイアウトmy_view.xml
です。
そして、これが私の Activity の onCreateLiveViewActivity
です。
最後にスタックトレースです。