2013-07-20 3 views
3

하나의 액티비티에 3 개의 ImageViews를 추가하고, 하나는 헤더이고, 다른 하나는 바닥 글이고, 다른 하나는 ScrollView 내에있는 문제입니다. 나는 android_2.1_r1 버전을 사용하고 있으며, 매우 이상한 문제를 발견했습니다. 왜 그런 일이 일어 났는지 말할 수 있지만, 계속 진행되고 있습니다.안드로이드 창이 전체 화면을 제공하지 않습니다.

DecorView를 가져 와서 보이는 직사각형을 요청하면 x = 0 y = 38가 화면 상단으로 보입니다. 왜 이렇게합니까? 상단의 이미지 크기를 40보다 크게 변경하면 사라집니다.

누군가를 생각해 내면 안됩니다. 나는이 세트를 가지고있다.

requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
           WindowManager.LayoutParams.FLAG_FULLSCREEN) 

첨부 된 스크린 샷을 참조하십시오. 빨간색 막대가 상단과 일치해야합니다. 그러나 어떤 이유로 DecorView는 상단에 인세 트가 있다고 결정합니까? 어떤 도움을 주셔서 감사합니다. 1

UPDATE 그래서 나는이 문제를 발견, 그것은 ScrollView.setFocusableInTouchMode, 아래 내 코드를 참조하십시오. 주석 처리 된 행의 주석 처리가 해제되면 문제가 발생합니다. 그러나 최상위 이미지보기가 높이가 20보다 작을 때만 가능합니다. 누군가가 약간의 빛을 흘릴 수 있습니까 ????? 나는 노력했다. 나는 회전 할 때

  • RelativeLayout의
  • AbsoluteLayout
  • 있는 LinearLayout 2

    낯선 여전히

UPDATE는 다시 회전, 그 고정! x = 0, y = 38 인세 트가 사라졌습니다 ???? 그리고 나의 스크린의 정상에 검은 선은 참는다?

UPDATE 3

내가 소프트 키 패드를 보여줄 때이 문제가 사라질 때, 그 뭔가를 재설정 것처럼. 나는 또한 내가 오히려 누군가가 XML 레이아웃을 제시하지 않았을 0

public void onGlobalLayout() { 
     AndroidActivity activity = screen.getActivity(); 
     Window window = activity.getWindow(); 
     View view = window.getDecorView(); 

     view.getWindowVisibleDisplayFrame(currentlyVisibleRect); 

     if(currentlyVisibleRect.top > 0) { 
     // Below code will not work....but you get the idea 
     Field field1 = view.getClass().getDeclaredField("mAttachInfo"); 
     Field field2 = field.get(view).getClass().getDeclaredField("mVisibleInsets"); 
     Rect rect = field2.get(field1.get(view)); 

     rect.top = 0; 
     } 
    } 

에 루트 뷰 세트를 설정하는 반사를 사용하여 OnGlobalLayoutListener으로 문제를 해결할 수 있습니다, 내 응용 프로그램은 매우 역동적이고 다양한 규칙에 따라이어야한다 레이아웃을 만드는 방법.

import android.app.Activity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsoluteLayout; 
import android.widget.ScrollView; 

public class AndroidLayoutManager { 

    private final Activity activity; 
    private final Rectangle bounds; 
    private final String name; 

    public AndroidLayoutManager(Activity activity, Rectangle bounds, String name) { 
     this.activity = activity; 
     this.bounds = bounds; 
     this.name = name; 
    } 

    public ViewGroup createLayout(ViewLayout viewLayout, ViewComponent headerView, ViewComponent mainView, ViewComponent footerView) { 
     AbsoluteLayout relativeLayout = new AbsoluteLayout(activity); 
     AbsoluteLayout.LayoutParams fullScreenParams = new AbsoluteLayout.LayoutParams(bounds.width, bounds.height, 0, 0); 

     if(viewLayout.isHeaderIncluded()) { 
     AbsoluteLayout.LayoutParams headerViewParams = headerView.getLayoutParams(); 
     View view = headerView.getView(); 

     view.setLayoutParams(headerViewParams); 
     relativeLayout.addView(view, headerViewParams); 
     } 
     if(viewLayout.isMainIncluded()) { 
     AbsoluteLayout.LayoutParams mainViewParams = mainView.getLayoutParams(); 
     View view = mainView.getView(); 
     View scrollView = createScrollView(view); 

     scrollView.setLayoutParams(mainViewParams); 
     relativeLayout.addView(scrollView, mainViewParams); 
     } 
     if(viewLayout.isFooterIncluded()) { 
     AbsoluteLayout.LayoutParams footerViewParams = footerView.getLayoutParams(); 
     View view = footerView.getView(); 

     view.setLayoutParams(footerViewParams); 
     relativeLayout.addView(view, footerViewParams); 
     } 
     relativeLayout.requestLayout(); 
     activity.setContentView(relativeLayout, fullScreenParams); 
     mainView.getView().requestFocus(); 
     activity.getWindow().getDecorView().requestLayout(); 

     return relativeLayout; 
    } 

    private View createScrollView(View view) { 
     ScrollView scrollView = new ScrollView(activity); 

     // ******** WTF??? This is causing a strange layout problem ******* 
     //scrollView.setFocusableInTouchMode(true); 
     scrollView.requestFocus(); 
     scrollView.setFocusable(true); 
     scrollView.setVerticalScrollBarEnabled(false); 
     scrollView.addView(view); 
     scrollView.setFillViewport(true); 

     return scrollView; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 

    public static class ViewLayout { 

     private Rectangle header; 
     private Rectangle main; 
     private Rectangle footer; 

     public ViewLayout(Rectangle header, Rectangle main, Rectangle footer) { 
     this.header = header; 
     this.main = main; 
     this.footer = footer; 
     } 

     public boolean isMainIncluded() { 
     return main != null; 
     } 

     public boolean isFooterIncluded() { 
     return footer != null; 
     } 

     public boolean isHeaderIncluded() { 
     return header != null; 
     } 

     public Point getHeaderPoint() { 
     return new Point(0, 0); 
     } 

     public Point getMainPoint() { 
     if(header != null) { 
      return new Point(0, header.height); 
     } 
     return new Point(0, 0); 
     } 

     public Point getFooterPoint() { 
     if(header == null) { 
      return new Point(0, main.height); 
     } 
     return new Point(0, main.height + header.height); 
     } 

     public int getHeight() { 
     int totalHeight = main.height; 

     if(header != null) { 
      totalHeight += header.height; 
     } 
     if(footer != null) { 
      totalHeight += footer.height; 
     } 
     return totalHeight; 
     } 
    } 

    public static class ViewComponent { 

     private final Rectangle rectangle; 
     private final Point origin; 
     private final View view; 

     public ViewComponent(View view, Rectangle rectangle, Point origin) { 
     this.view = view; 
     this.rectangle = rectangle; 
     this.origin = origin; 
     } 

     public AbsoluteLayout.LayoutParams getLayoutParams() { 
     return new AbsoluteLayout.LayoutParams(rectangle.width, rectangle.height, origin.x, origin.y); 
     } 

     public View getView() { 
     return view; 
     } 
    } 
} 

enter image description here

+1

XML을 게시 할 수 있습니까? – Brian

+0

그래, 문제가 무엇인지 실제로 알기 위해서는 레이아웃 XML이 필요합니다. – Eggman87

+0

이 예제 코드는 android-2.1_r1 및 다른 버전의 버그 일 가능성이 높습니다. –

답변

0

코드 requestWindowFeature(...)getWindow().setFlag(....)가 된 setContentView 이전이어야합니다(). 이것은 내 알림입니다

+0

네, 그 첫 번째 일은 다음과 같습니다. requestWindowFeature (android.view.Window.FEATURE_NO_TITLE); setVolumeControlStream (AudioManager.STREAM_MUSIC); getWindow() .setFormat (PixelFormat.RGBA_8888); getWindow() .setFlags (WindowManager.LayoutParams.FLAG_DITHER, WindowManager.LayoutParams.FLAG_DITHER); . 하여 GetWindow() SETFLAGS (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); –

관련 문제