Android getWindowManager().getDefaultDisplay().getMetrics(度量)工作不正常

Android getWindowManager().getDefaultDisplay().getMetrics(度量)工作不正常,android,android-screen,Android,Android Screen,我正在使用这个代码,来获取屏幕大小 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.some_layout); //more stuff setTextSize(); } private void setTextSize() { DisplayMetrics metrics = new

我正在使用这个代码,来获取屏幕大小

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.some_layout);
    //more stuff
    setTextSize();
}

private void setTextSize() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int width = metrics.widthPixels;
    //more code
    sometextview.setTextSize(TypedValue.COMPLEX_UNIT_PX, width/10); //example only
}

事实证明,在极少数情况下,这不起作用。我设置了一些文本大小,有时根本不调整文本大小。我认为它只在我有一段时间没有打开应用程序时才会发生,所以调试它非常困难。我唯一的想法是,这是在应用程序知道屏幕大小之前询问屏幕大小(这是第一个活动)。我怎样才能解决这个问题?这是我所知道的唯一一种支持所有API的获取屏幕分辨率的方法。

对于这个特定的文本视图,您需要使用ViewTreeObserver

一些代码片段

ViewTreeObserver vto = myTextView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                setTextSize();

            }
        });

您唯一需要注意的是,每次视图更改时都会重复调用该函数,因此您需要保留一个脏标记来跟踪更改。

尝试(请参见第一个答案)它的工作原理相同,问题是可能要过几天“错误”才会发生。