ListView
内のレイアウトを拡張しようとすると、次のエラーが発生します。
requestLayout() improperly called by Android.widget.TextView{...} during layout: running second layout pass
次のようにListView
内のレイアウトを膨張させようとしています。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
LayoutInflater inflater = (LayoutInflater) musicActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, parent, false);
...
}else{...}
}
膨らまされているレイアウトは、次のようにシンプルに見えることがありますが、それでもエラーが発生します
<TextView
Android:id="@+id/txt"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textSize="@dimen/txt_size"/>
私は同様の質問を調べましたが、解決策が見つからなかったようです 質問1 、 質問2 、 質問 .
誰がこのタイプのエラーの原因を知っていますか?トラブルシューティングのアドバイスはありますか?より多くのコンテキストについては、このListView
はFragment
内のViewPager
内に表示されます
ここに完全なXMLレイアウト(属性の束を差し引いたもの)がありますが、それでも問題が発生します
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:id="@+id/txt1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
<TextView
Android:id="@+id/txt2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
<TextView
Android:id="@+id/txt3"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
<TextView
Android:id="@+id/txt4"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
</RelativeLayout>
これに基づいて、ViewPagerとFragmentsを使用しているという事実に関係しない限り、XML自体は問題ではないと思います。
この問題はAndroid実装のバグのようです。以下を参照してください: https://code.google.com/p/Android/issues/detail?id=75516
ListView.setFastScrollEnabled(true)
を介してコード内のListView
の高速スクロール機能を有効にすると、このバグがトリガーされ、
requestLayout()は、レイアウト中にAndroid.widget.TextView {...}によって不適切に呼び出されます:2番目のレイアウトパスの実行
コンソールのメッセージ。
このバグは、KitKat(4.4.x)の最初のリリースでは見られなかったため、KitKat(4.4.x)のアップデートのいずれかで導入されたに違いありません。上記のデバッグメッセージを使用したコンソールのspamいスパムは別として、他の影響はないようです(場合によってはパフォーマンスをテストしていません)。
乾杯
PS:高速スクロール機能がバグになるのは初めてではありません。 https://code.google.com/p/Android/issues/detail?id=63545 、KitKat 4.4.3で63545が修正されましたが、その後75516がポップアップ表示されました->は厄介なようですグーグルの件名;-)
2015年5月12日編集:
Nexus 7をAndroid 5.1に数分前に(以前は5.0を実行していた)に更新し、この新しいバージョンでこの問題が表示されなくなりました。FastScrollインジケーターの外観も5.1で変更されたため、グーグルはこの問題を修正したか、少なくともコンソールをスパムしたthoseい行をコメントアウトしました...
75516 & 82461 はまだ「未解決」ですが、それらは同じ問題を指していると思いますが、現在は5.1で解決されています。
問題は、アダプターのメソッドgetView()
がレイアウトを表示している間、他のコードがこのビューにアクセスして表示しようとして、衝突が発生することです。
気にしないかもしれないいくつかのメソッド(setScale()
、setTypeFace()
など)が実際にrequestLayout()
を呼び出すことに注意してください。あなたのインフレステートメントの後。
私にとって、この問題はsetLayoutParams()
呼び出しで発生していました。解決策は、前述のようにルーパーに実行可能ファイルを投稿していました here
XMLのListViewでfastScrollを無効にして、この問題を修正しました。
<ListView
Android:id="@+id/mListview"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:fastScrollEnabled="false"
/>
同じ警告ログで問題が発生しました:
requestLayout() improperly called by Android.support.v7.widget.AppCompatTextView {...} during layout: running second layout pass
私はrecylcerviewで作業していたので、新しいデータで更新します。
ステップ1)。現在のデータを削除します。
public void removeAll() {
items.clear(); //clear list
notifyDataSetChanged();
}
ステップ2)。 recyclerviewに新しいデータを入力する場合、最初に新しいLayoutManagerを設定してrecyclerviewを再度設定します。
private void initRecycleView() {
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false));
}
ステップ(3)。 recyclerviewを新しいデータで更新します。例えば :
public void refreshData(List newItems) {
this.items = newItems;
notifyItemRangeChanged(0, items.size());
}
Genymotionを搭載したMotorola XのKitKat 4.4.4でも同じ問題が発生しました。私の場合、リストアイテムは単純なCheckedTextViewであり、AppCompatCheckedTextViewでエラーが発生しました。
通常の実装として、以下のようにXMLレイアウトファイルからアイテムを拡張しました。
if (convertView == null) {
convertView = inflater.inflate(R.layout.checkable_list_entry, parent, false);
}
いくつか試してみたところ、これはXMLのインフレーションと関係があることがわかりました。根本的な原因はわかりませんが、解決策として、リストアイテムをコードで膨らませ、すべてのプロパティをコードで設定することにしました。
次のようになりました:
CheckedTextView view;
if (convertView == null) {
view = new CheckedTextView(parent.getContext());
view.setMinHeight(getResources().getDimensionPixelSize(R.dimen.default_touch_height));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
view.setTextAppearance(R.style.SectionEntry);
} else {
view.setTextAppearance(parent.getContext(), R.style.SectionEntry);
}
view.setBackgroundResource(R.drawable.form_element);
view.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
view.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
} else {
view = (CheckedTextView) convertView;
}
これは、ListViewのサードパーティの拡張機能を使用している場合に発生する可能性があります。それを標準のListViewに置き換え、それでもエラーがスローされるかどうかを確認します。
同様の問題がありました。 Androidレイアウト:2番目のレイアウトパスの実行 と私の答えを確認してください。
私の場合(Samsung Galaxy S4、API 21)、これはEditTextsを使用したListViewで発生しました。フィールド検証用のリスナーがあります。何かのようなもの:
edit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
error.setVisibility(View.INVISIBLE);
error.setText("");
} else {
String s = edit.getText().toString();
if (s.isEmpty()) {
error.setText("Error 1");
} else if (s.length() < 2 || s.length() > 100) {
error.setText("Error 2");
}
error.setVisibility(View.VISIBLE);
}
}
});
これらのEditTextのいずれかにフォーカスを設定した後、上記のチェックが呼び出されます。その後、TextViewが変更されます(TextViewにはエラーメッセージが含まれ、EditTextの上にあります)。 2番目または3番目のEditTextにフォーカスを設定すると、最初のEditTextが永続的に要求され、現在のEditTextに戻ります。アプリケーションは、リクエストの無限ループで実行されます(フォーカス編集テキスト1、フォーカス非編集テキスト1、フォーカス3、フォーカス3、フォーカス1など)。
ListView.setFastScrollEnabled(false)を設定しようとしました。また、 https://github.com/sephiroth74/HorizontalVariableListView/issues/9 のようないくつかの要素のrequestLayout()を試しました。現在、XMLで固定幅と高さのTextViewを作成しました。
<TextView
Android:id="@+id/error"
Android:layout_width="match_parent" (or "200dp", but not "wrap_content")
Android:layout_height="20dp"
.../>
いくつかの実験の後、20dpの高さを「wrap_content」に置き換えることができることに気付きました。ただし、テキストが長すぎて2行に分割される場合、アプリケーションは再び無限ループに陥ります。そう、 Android:singleLine="true"
役立ちます。廃止されましたが、驚くほどAndroid:maxLines="1"
with Android:lines="1"
彼らは再びレイアウトを要求するので助けにはなりません。最終的には:
<TextView
Android:id="@+id/error"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:singleLine="true"
Android:textColor="#f00"
Android:textSize="20sp"
tools:text="Error message"/>
それは良い解決策ではありませんが、少なくとも無限ループを壊します。
私の場合、この警告により、API 21デバイスにボタンが表示されませんでした。ボタンの可視性は以前はGONEに設定されていました。
私が得た唯一の回避策は、API 21でGONEの代わりにINVISIBLEに設定することでした。これは実際のソリューションではありませんでしたが、私には受け入れられました。
誰かから役に立つかもしれないので、これを投稿するだけです。
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Lollipop) {
theButton.setVisibility(View.INVISIBLE);
}
else {
theButton.setVisibility(View.GONE);
}
場合によっては既に問題を修正しているかもしれませんが、それでも同じエラーが残るため、Visual Studioを閉じてからプロジェクトからすべてのbinおよびobjフォルダーを削除し、エミュレーターからアプリをアンインストールする必要があります。それからワラ!!すべてが正常に動作します
XmlからtextSizeを取り除いて、Javaコードで設定してみてください。