2016-05-09 8 views
4

リスナーが追加されていない場合でもグローバルレイアウトリスナーが追加されます。この状況ではループします。グローバルレイアウトリスナをループで実行せずに属性を編集するにはどうすればよいですか?この種のあなたのアンドロイドでAndroidグローバルレイアウトリスナーを繰り返し呼び出す

final View getDecorView = activity.getWindow().getDecorView(); 
      getDecorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 

        if (Build.VERSION.SDK_INT > 16) { 
         getDecorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
        } else { 
         getDecorView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        } 

        final TextView textView3 = (TextView) decorView.findViewById(2131558456); 
        if (textView3 != null) { 
           textView3.setText("updated");      textView3.setBackgroundColor(Color.parseColor("#444444")); 
        } 

        getDecorView.getViewTreeObserver().addOnGlobalLayoutListener(this); 

       } 
      }); 
+0

変更 'getDecorView.getViewTreeObserver()addOnGlobalLayoutListener(この)解決;' 'getDecorView.getViewTreeObserver()removeOnGlobalLayoutListener(これ)にし;'あなた 'onGlobalLayout()'内部 – NSimon

+0

@ NicolasSimonは正しいです、あなたはそれぞれの呼び出しの最後に 'GlobalLayoutListener'を付け直しています。なぜそれが繰り返し呼び出されるのかです。その行を削除します。 – roarster

+0

@roarsterそれは私が実際にやりたがっているものですが、テキストを設定する以外は解雇したいので、それを取り除いた後にリスナーを付ける理由はどうすれば実現できますか?ありがとうございました。 – Mike

答えて

3

に感謝して、あなたの問題を解決:

final View decorView = activity.getWindow().getDecorView(); 
final TextView textView3 = (TextView) decorView.findViewById(2131558456); 
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 

     if (Build.VERSION.SDK_INT > 16) { 
      decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } else { 
      decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 


     if (textView3 != null && !textView3.getText().equals("updated")) { 
      textView3.setText("updated"); 
      textView3.setBackgroundColor(Color.parseColor("#444444")); 
     } 

     decorView.getViewTreeObserver().addOnGlobalLayoutListener(this); 

    } 
}); 

私はtextview3はもともと「更新」に等しいのテキストを持っていないことを仮定しているので、あなたは、そのテキストを「更新するように設定する場合"、それは一種の旗のように働くので、あなたは将来それを再設定しません。また、TextViewを更新するかどうかを表す実際のブール値フラグがあるため、IMHOは少し洗練されています。彼らは上と上...つながる別のレイアウトパスにつながるtextview3の更新につながる別のレイアウトパスにつながるtextview3の定数の更新を停止するので

final View decorView = activity.getWindow().getDecorView(); 
final TextView textView3 = (TextView) decorView.findViewById(2131558456); 
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

    boolean updateTextview = true; 

    @Override 
    public void onGlobalLayout() { 

     if (Build.VERSION.SDK_INT > 16) { 
      decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } else { 
      decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 


     if (textView3 != null && updateTextview) { 
      updateTextview = false; 
      textView3.setText("updated"); 
      textView3.setBackgroundColor(Color.parseColor("#444444")); 
     } 

     decorView.getViewTreeObserver().addOnGlobalLayoutListener(this); 

    } 
}); 

どちらのソリューションは、動作するはずです。

+0

私はこの時点で更新するビューがたくさんあるので、ifsをチェックすることは大きな問題になるでしょう。設定しても追加するときにリスナーがなくてもなぜ解雇されるのですか?ありがとう:) – Mike

+0

'getDecorView.post(新しいRunnableを(){@Override ます。public void実行(){ getDecorView.getViewTreeObserver()addOnGlobalLayoutListener(リスナー);} });'この1つは働いていた、なぜかあなたはこれが働いたと思いますか? – Mike

+0

ああ、私は 'View#post()'について完全に忘れてしまいました!それは、次の繰り返しで実行されるUIメッセージキューに 'Runnable'を追加します。そこで 'Runnable'を追加すると、アンドロイドは' TextViews'を更新し、UIスレッド上のメッセージを起動してRunnableを実行します。あなたには良い説明がいくつかありますが、時にはうまくいくかもしれないし、他の時にはうまくいかないかもしれません。あなたは 'View#postDelayed()'を試してみることができますが、あなたが持っているものでうまくいくはずです:) – roarster

0

この1つは問題に

final ViewTreeObserver.OnGlobalLayoutListener listener = this; 

       if (Build.VERSION.SDK_INT > 16) { 
        getDecorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } else { 
        getDecorView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 

       final TextView textView3 = (TextView) decorView.findViewById(2131558456); 
       if (textView3 != null) { 
        textView3.setText("fert"); 
        textView3.setBackgroundColor(Color.parseColor("#444444")); 
       } 

       getDecorView.post(new Runnable() { 
        @Override 
        public void run() { 
         getDecorView.getViewTreeObserver().addOnGlobalLayoutListener(listener); 
        } 
       }); 
関連する問題