2016-07-16 11 views
0

ビューに「もの」を描画する目的で、OverlayBuildというクラスがありますが、何らかの理由で単純なような問題が発生しましたが、時間。問題は、クラスが2番目(3番目、4番目など)に使用されるときに、描画/ビューが親ビューに追加されないか、少なくとも表示されないことです。Androidでビューをもう一度追加することはできません

エラーの原因を特定するためにクラスを単純化しようとしましたが、それでもエラーが発生します。だからここ

は最初OverlayBuildクラスの私のコードです:あなたが見ることができるように

public static void showEmptyState(final Context context, final Button createAgentBtn, final ViewGroup parentView, final String tag) { 

      final OverlayBuild builder = new OverlayBuild(context, parentView, tag); 
      builder.setLayoutListener(new OverlayBuild.LayoutListener() { 
       @Override 
       public void layoutPrepared(ViewGroup view) { 
        final ViewGroup.MarginLayoutParams btnParams = (ViewGroup.MarginLayoutParams) createAgentBtn.getLayoutParams(); 

        final int parentWidth = parentView.getWidth(); 
        final int parentHeight = parentView.getHeight(); 

        builder.setBackgroundDimens(parentWidth,parentHeight) 
          .commit(); 
       } 
      }); 
     } 

public class OverlayBuild { 

    private String tag; 
    private Context context; 
    private ViewGroup container; 
    private RelativeLayout overlay; 
    public static boolean layoutLoaded; 
    private int backgroundWidth  = 1500; 
    private int backgroundHeight = 1500; 
    private boolean overlayLayoutCompleted; 


    public OverlayBuild(Context context, ViewGroup container, String tag) { 
     this.tag      = tag; 
     this.context     = context; 
     this.container     = container; 
     this.overlay     = new RelativeLayout(context); 
     layoutLoaded     = false; 
    } 

    public OverlayBuild setLayoutListener(final LayoutListener layoutListener) { 
     container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       if (!layoutLoaded) { 
        layoutListener.layoutPrepared(container); 
        layoutLoaded = true; 
       } 
      } 
     }); 

     return this; 
    } 
    public OverlayBuild setBackgroundDimens(int width, int height) { 
     this.backgroundWidth = width; 
     this.backgroundHeight = height; 
     return this; 
    } 

    public OverlayBuild hideOverlay(){ 
     if(overlay != null){ 
      overlay.setVisibility(View.GONE); 
     } 
     return this; 
    } 


    public OverlayBuild commit() { 
     View view = getViewByTag(tag); 
     if (view == null) { 
      container.addView(overlay); 
      overlayLayoutCompleted = true; 
      overlay.setTag(tag); 

      overlay.bringToFront(); 
      overlay.setVisibility(View.VISIBLE); 

      container.setBackgroundResource(R.color.red); 
      overlay.setBackgroundResource(R.color.blue_mid); 
     } 


     return this; 
    } 


    private View getViewByTag(String tag) { 
     return container.findViewWithTag(tag); 
    } 

    public interface LayoutListener { 
     void layoutPrepared(ViewGroup view); 
    } 

そして、ここでは、私は「描く」ためにクラスを使用する方法であり、メソッドは、 "コミット()"と呼ばれる、私はいくつかの背景色を設定しています(テスト目的のため)。結論として、初めて色は画面に表示されますが、次回は表示されません。

私はそれをデバッグしました(多く!)、コード内のすべての場所に到達していることを確認できますそれはすべきだ。

私は本当に誰かが私を助けることを願っています。どんな助けでも大歓迎です。

答えて

1

私は自分自身で答えを見つけました。フィールドを変更することにより:

public static boolean layoutLoaded 

「非静的」する:呼び出されたときの状態の混乱を引き起こし、このブール値の単一のインスタンスがあったとして

public boolean layoutLoaded 

問題は、解決されました2回目。

+0

ああ!うん、それはやるよ。 – w3bshark

1

私は確信が持てませんが、commit()が2回目に呼び出されたときのように見えますが、おそらく== nullは表示されません。したがって、addView()コールがヌルチェック内にあるため、ビューは再び追加されません。

[レイアウト境界を表示]設定をオンにして、現在のコードをテストする必要があります。これは、ビューが表示されないときに私を助けてくれました。 設定 - >デベロッパーオプション - >「レイアウト境界を表示」をオンにします。次に、2番目のビューを追加する場所にコードを実行し、追加する予定の2番目のオーバーレイビューのレイアウト範囲が表示されるかどうかを確認します。

また、overlay.bringToFront();を呼び出してみましたか?スタックに追加したオーバーレイビューを追跡し、追加/削除するときに押す/ポップすることもできます。

希望すると便利です。

+0

ありがとうございました。私は、特に、c​​ommit()メソッドで、何かが間違っていると思われる場所で、ヌルチェックでの提案を含め、さまざまなアプローチを試みました。私が投稿したソリューションは、多くのソリューションの1つに過ぎません。しかし、あなたの答えは他の方法(例えば「レイアウトの境界を表示」)で非常に役立つことが分かりましたので、私はあなたの答えをアップアップしますが、最後に問題の解決策を見つけました(興味があれば私の答えを見てください)。 – Langkiller

関連する問題