其他方法未调用onCreate

时间:2014-03-04 10:10:28

标签: java android xml layout oncreate

我们正在开发Android应用程序,我们希望在显示View时重新启动我们的UI。 因为我们无法计算XML文件中按钮的高度,所以我们要计算它并显示它抛出我们的Java代码。 但是当我们从onCreate中调用它时,我们的方法fit()不起作用,而当我们从Action溢出调用它时它可以工作。 我们在Android模拟器和三星Galaxy SIII上尝试了这个代码。 有人可以帮助我们吗? 谢谢Fotoschnitzel

以下是代码:

public class Game extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.classic);

            fit();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.potz1000, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.settings:

            fit();

            default:
                return super.onOptionsItemSelected(item);
        }

    }


    public void fit() {

        Button Button1=(Button)findViewById(R.id.grid1);
        Button Button2=(Button)findViewById(R.id.grid2);
        Button Button3=(Button)findViewById(R.id.grid3);
        Button Button4=(Button)findViewById(R.id.grid4);
        Button Button5=(Button)findViewById(R.id.grid5);
        Button Button6=(Button)findViewById(R.id.grid6);
        Button Button7=(Button)findViewById(R.id.grid7);
        Button Button8=(Button)findViewById(R.id.grid8);
        Button Button9=(Button)findViewById(R.id.grid9);
        LinearLayout Lin1=(LinearLayout)findViewById(R.id.lin1);
        LinearLayout Lin2=(LinearLayout)findViewById(R.id.lin2);
        LinearLayout Lin3=(LinearLayout)findViewById(R.id.lin3);
        LinearLayout Global=(LinearLayout)findViewById(R.id.LinearLayout1);
        LinearLayout Up=(LinearLayout)findViewById(R.id.bestfiller);
        ProgressBar Bar=(ProgressBar)findViewById(R.id.progressBar1);

        int x = Button1.getWidth();
        int y = Global.getHeight();
        int z = Bar.getHeight();

        int Filler=y-3*x-z;
        if (Filler > 50){
        Up.setLayoutParams(new LinearLayout.LayoutParams(3*x, Filler));
        Lin1.setLayoutParams(new LinearLayout.LayoutParams(3*x, x));
        Lin2.setLayoutParams(new LinearLayout.LayoutParams(3*x, x));
        Lin3.setLayoutParams(new LinearLayout.LayoutParams(3*x, x));} 
        double size= x*0.4;
        Button1.setTextSize((float)size);
        Button2.setTextSize((float)size);
        Button3.setTextSize((float)size);
        Button4.setTextSize((float)size);
        Button5.setTextSize((float)size);
        Button6.setTextSize((float)size);
        Button7.setTextSize((float)size);
        Button8.setTextSize((float)size);
        Button9.setTextSize((float)size);

    }

}

3 个答案:

答案 0 :(得分:0)

我可以向您保证,在应用程序启动时也会调用该方法。你的问题是另一回事。您正在检查Filler条件,但刚刚在setContentView

之后
    int x = Button1.getWidth();
    int y = Global.getHeight();
    int z = Bar.getHeight();

xyz为0,使if条件为false

答案 1 :(得分:0)

视图层次结构尚未测量和布局,因此getWidth()getHeight()将返回0.

您可以在测量/布局传递后将Runnable发布到调用fit()方法的UI线程消息队列。见How to retrieve the dimensions of a view?

答案 2 :(得分:0)

使用OnGlobalLayoutListener

rootView.getViewTreeObserver().addOnGlovalLayoutListener( new OnGlobalLayoutListener() {

    public void onGlobalLayout() {
        //all views are measured now and getWidth() and getHeight() will return correct values

        //don't forget to unregister the listener for future layout events
        rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

    }

});