Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 在android中返回默认值/初始值的方法_Java_Android_Methods_Return Value - Fatal编程技术网

Java 在android中返回默认值/初始值的方法

Java 在android中返回默认值/初始值的方法,java,android,methods,return-value,Java,Android,Methods,Return Value,嗨,我正在根据我的图像视图获取坐标值。所以,现在我尝试全局使用这些坐标值,但我的方法返回零(默认值/初始值),但它在方法内部打印正确的值。请帮帮我 代码: MainActivity.java public class StackActivity extends ActionBarActivity { ImageView firstDot, middleDot, lastDot; int distaceHoriz; @Override protected void onCreate(Bund

嗨,我正在根据我的图像视图获取坐标值。所以,现在我尝试全局使用这些坐标值,但我的方法返回零(默认值/初始值),但它在方法内部打印正确的值。请帮帮我

代码: MainActivity.java

public class StackActivity extends ActionBarActivity {

ImageView firstDot, middleDot, lastDot;

int distaceHoriz;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_stack);

    firstDot = (ImageView) findViewById(R.id.img_dot_starting);
    middleDot = (ImageView) findViewById(R.id.img_dot_middle);
    lastDot = (ImageView) findViewById(R.id.img_dot_last);

    distance(firstDot);
    Log.e("distaceHorizFirst", distaceHoriz+"");

    distance(middleDot);
    Log.e("distaceHorizMiddle", distaceHoriz+"");

    distance(lastDot);
    Log.e("distaceHorizLast", distaceHoriz+"");


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.stack, 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);
}

 public int distance(final View view) {


    view.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {


                @Override
                public void onGlobalLayout() {

                    view.getViewTreeObserver()
                            .removeGlobalOnLayoutListener(this);

                    int[] locations = new int[2];
                    view.getLocationOnScreen(locations);
                    distaceHoriz = locations[0];
                    // int vertDistanceToLastDot = locations[1];

                    Log.e("distaceHoriz:", ""+ distaceHoriz);

                }
            });
    return distaceHoriz;

}
}
MainLayout.xml

<ImageView
    android:id="@+id/img_dot_starting"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_marginTop="42dp"
    android:layout_alignParentLeft="true"
    android:src="@drawable/icon_round" />

<ImageView
    android:id="@+id/img_dot_middle"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_marginTop="42dp"
    android:layout_centerHorizontal="true"
    android:src="@drawable/icon_round" />

<ImageView
    android:id="@+id/img_dot_last"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_marginTop="42dp"
    android:layout_alignParentRight="true"
    android:src="@drawable/icon_round" />

尝试使用
addonPreDrawListener

public int distance(final View view) {
int distaceHoriz; 
    ViewTreeObserver vto = view.getViewTreeObserver();
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            public boolean onPreDraw() {
                view.getViewTreeObserver().removeOnPreDrawListener(this);
               int[] locations = new int[2];
                    view.getLocationOnScreen(locations);
                    distaceHoriz = locations[0];
                    // int vertDistanceToLastDot = locations[1];

                    Log.e("distaceHoriz:", ""+ distaceHoriz);
            }
        });
return distaceHoriz;
}

这是因为
OnGlobalLayoutListener
的异步特性。
onGlobalLayout()
的内容不会立即执行,而是在不久的将来执行。但是,您的
distance()
方法确实同步运行,并立即返回默认值(因为实际分配您所追求的值的代码尚未执行)。我认为您错误地认为,通过将侦听器放在您自己的方法中,它的回调会立即运行。事实并非如此。