하나의 액티비티에 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;
}
}
}
XML을 게시 할 수 있습니까? – Brian
그래, 문제가 무엇인지 실제로 알기 위해서는 레이아웃 XML이 필요합니다. – Eggman87
이 예제 코드는 android-2.1_r1 및 다른 버전의 버그 일 가능성이 높습니다. –