Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用onMeasure控制视图的大小会将其他元素从屏幕上推出_Java_Android - Fatal编程技术网

Java 使用onMeasure控制视图的大小会将其他元素从屏幕上推出

Java 使用onMeasure控制视图的大小会将其他元素从屏幕上推出,java,android,Java,Android,为了创建一个方形视图(其中允许宽度变化,但高度设置为等于屏幕截图中的宽度-绿色),我创建了扩展视图并覆盖了onMeasure 正确执行此操作将强制视图保持方形。然而;它与屏幕上的其他元素“玩得不好”。如果SquareView比其自然尺寸大,则将其推离屏幕。下面的屏幕截图演示了这一点。SquareView后面是ScrollView,其中包含降序数字23-1。当SquareView覆盖onMeasure时,即使将ScrollView滚动到最底部,最后几个数字也会被切断。当它没有被覆盖时,所有的东西都

为了创建一个方形视图(其中允许宽度变化,但高度设置为等于屏幕截图中的宽度-绿色),我创建了扩展视图并覆盖了onMeasure

正确执行此操作将强制视图保持方形。然而;它与屏幕上的其他元素“玩得不好”。如果SquareView比其自然尺寸大,则将其推离屏幕。下面的屏幕截图演示了这一点。SquareView后面是ScrollView,其中包含降序数字23-1。当SquareView覆盖onMeasure时,即使将ScrollView滚动到最底部,最后几个数字也会被切断。当它没有被覆盖时,所有的东西都非常适合(但是SquareView不是正方形的)

我相信其他的东西都是根据SquareView的自然大小来确定大小的,然后我调整它的大小就把一切都搞糟了

如何创建一个视图,使其自身大小调整为方形,而不将其他元素从屏幕上推出

除此之外,还要切断末端;滚动时,滚动条明显错误并延伸到屏幕外

SquareView:

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"
      >
      .......