web-dev-qa-db-ja.com

Android:requestLayout()が不適切に呼び出されました

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質問 .

誰がこのタイプのエラーの原因を知っていますか?トラブルシューティングのアドバイスはありますか?より多くのコンテキストについては、このListViewFragment内の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自体は問題ではないと思います。

42
Daiwik Daarun

この問題は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い行をコメントアウトしました...

7551682461 はまだ「未解決」ですが、それらは同じ問題を指していると思いますが、現在は5.1で解決されています。

41
darksaga

問題は、アダプターのメソッドgetView()がレイアウトを表示している間、他のコードがこのビューにアクセスして表示しようとして、衝突が発生することです。

気にしないかもしれないいくつかのメソッド(setScale()setTypeFace()など)が実際にrequestLayout()を呼び出すことに注意してください。あなたのインフレステートメントの後。

16
axl coder

私にとって、この問題はsetLayoutParams()呼び出しで発生していました。解決策は、前述のようにルーパーに実行可能ファイルを投稿していました here

7
VladimirVip

XMLのListViewでfastScrollを無効にして、この問題を修正しました。

<ListView
    Android:id="@+id/mListview"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"

    Android:fastScrollEnabled="false"
/>
5
Joaquin Iurchuk

同じ警告ログで問題が発生しました:

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());
}
1
Ghasem Sadeghi

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;
}
1
Thomas R.

これは、ListViewのサードパーティの拡張機能を使用している場合に発生する可能性があります。それを標準のListViewに置き換え、それでもエラーがスローされるかどうかを確認します。

同様の問題がありました。 Androidレイアウト:2番目のレイアウトパスの実行 と私の答えを確認してください。

1
ksarmalkar

私の場合(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/Horizo​​ntalVariableListView/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"/>

それは良い解決策ではありませんが、少なくとも無限ループを壊します。

1
CoolMind

私の場合、この警告により、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);
}
1
Javier Torón

場合によっては既に問題を修正しているかもしれませんが、それでも同じエラーが残るため、Visual Studioを閉じてからプロジェクトからすべてのbinおよびobjフォルダーを削除し、エミュレーターからアプリをアンインストールする必要があります。それからワラ!!すべてが正常に動作します

0
A. Almazidi

XmlからtextSizeを取り除いて、Javaコードで設定してみてください。

0
Gabe Sechan