Java 使用onMeasure控制视图的大小会将其他元素从屏幕上推出
为了创建一个方形视图(其中允许宽度变化,但高度设置为等于屏幕截图中的宽度-绿色),我创建了扩展视图并覆盖了onMeasure 正确执行此操作将强制视图保持方形。然而;它与屏幕上的其他元素“玩得不好”。如果SquareView比其自然尺寸大,则将其推离屏幕。下面的屏幕截图演示了这一点。SquareView后面是ScrollView,其中包含降序数字23-1。当SquareView覆盖onMeasure时,即使将ScrollView滚动到最底部,最后几个数字也会被切断。当它没有被覆盖时,所有的东西都非常适合(但是SquareView不是正方形的) 我相信其他的东西都是根据SquareView的自然大小来确定大小的,然后我调整它的大小就把一切都搞糟了 如何创建一个视图,使其自身大小调整为方形,而不将其他元素从屏幕上推出 除此之外,还要切断末端;滚动时,滚动条明显错误并延伸到屏幕外 SquareView:Java 使用onMeasure控制视图的大小会将其他元素从屏幕上推出,java,android,Java,Android,为了创建一个方形视图(其中允许宽度变化,但高度设置为等于屏幕截图中的宽度-绿色),我创建了扩展视图并覆盖了onMeasure 正确执行此操作将强制视图保持方形。然而;它与屏幕上的其他元素“玩得不好”。如果SquareView比其自然尺寸大,则将其推离屏幕。下面的屏幕截图演示了这一点。SquareView后面是ScrollView,其中包含降序数字23-1。当SquareView覆盖onMeasure时,即使将ScrollView滚动到最底部,最后几个数字也会被切断。当它没有被覆盖时,所有的东西都
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;
public class SquareView extends View{
public SquareView(Context context, AttributeSet aSet) {
super(context, aSet);
this.setBackgroundColor(Color.GREEN);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
setMeasuredDimension( width, width);
}
}
XML:
来自(我在谷歌上搜索了square view…)
这里的问题是使用权重定义
SquareView
的高度,并明确设置其高度。这实际上是有道理的,因为您不能同时定义按权重分割的剩余空间,并显式地设置其中一个元素的大小,而不必给出一些东西
因此,需要进行以下更改
<com.example.resizeissue.SquareView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_margin="20dip"
android:id="@+id/the_canvas"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
.......
.......
这将使空间中的所有内容都非常适合您是否尝试过将方形视图的布局高度属性设置为包裹内容?我建议使用RelativeLayout,并在ScrollView上放置
android:layout_down=“@id/the_canvas”
,但我认为这两种方法都会导致ScrollView以横向方式被推出屏幕。@DaveMorrissey为此,我将应用程序锁定为横向,因此这不是问题。我会看看这两个选项now@DaveMorrissey将方形视图的layout_height属性设置为“wrap_content”会导致“natural height”为零,因此ScrollView最终大部分位于(调整大小的)方形视图后面。然而,RelativeLayout的行为完全符合我的要求。你愿意把答案写下来吗?(如果不是的话,我会的,但我不能100%确定为什么这是可行的,线性布局不可行,就是这样)我也不确定,这是一种直觉:-)这和我问题中的代码差不多,你的代码有“super.onMeasure(widthMeasureSpec,heightMeasureSpec);”与我的不同,但添加到我的没有区别
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int size = 0;
int width = getMeasuredWidth();
int height = getMeasuredHeight();
if (width > height) {
size = height;
} else {
size = width;
}
setMeasuredDimension(size, size);
}
<com.example.resizeissue.SquareView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_margin="20dip"
android:id="@+id/the_canvas"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
.......