2014-10-08 50 views
1
public class QuadPadFragment extends Fragment { 

int w = 0; int h = 0; 

public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { 

    final View view = inflater.inflate(R.layout.quadpadlayout, container, false); 

    container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      h = container.getMeasuredHeight(); 
      w = container.getMeasuredWidth(); 
      Log.w("QuadPad Fragment:------", "window width: " + w + " window height: " + h); 

      view.setLayoutParams(new LayoutParams(1, 1)); 
     } 
    }); 

    return view; 
    } 
} 

我有上面的类写的,一切正常,但令我费解的是为什么onGlobalLayout调用两次?即时得到这个输出Log片段--onGlobalLayout()调用两次

W/QuadPad Fragment:------(27180): window width: 1080 window height: 1 
W/QuadPad Fragment:------(27180): window width: 1080 window height: 1 

回答

4

我想这是因为你有setLayoutParams。这将再次调用globalLayout。你必须注销听众,这样它才不会被叫两次。上面的代码将删除侦听器。

  @Override 
      public void onGlobalLayout() { 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
        container.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } else { 
        container.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
       h = container.getMeasuredHeight(); 
       w = container.getMeasuredWidth(); 
       Log.w("QuadPad Fragment:------", "window width: " + w + " window height: " + h); 

       view.setLayoutParams(new LayoutParams(1, 1)); 
      }