0

在我的应用程序中,我根据当前屏幕宽度制作了很多 UI。
我有一个辅助方法可以完美地做到这一点:

 public static int getW() {
    int width = ((WindowManager) appContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
    return width;
}

但是当我为多窗口调整活动大小时,该函数返回手机屏幕宽度,而不是当前。并且大部分 UI 中断。
我需要一种机制来计算活动的 onCreate() 中的宽度(OnGlobalLayoutListener 无济于事 - 因为在 onCreate 中直接完成了许多初始化)

4

1 回答 1

0

设法在我的 App 类中使用下一个方法来做到这一点:

  public static Point getSize(){
    Point point = new Point();
    if (Build.VERSION.SDK_INT >= 21  && LifecycleHandler.getInstance().getCurrentActivity() != null){
        DisplayMetrics metrics = new DisplayMetrics();
        LifecycleHandler.getInstance().getCurrentActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
        point.x = metrics.widthPixels;
        point.y = metrics.heightPixels;
    } else {
        ((WindowManager) appContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(point);
    }

    return point;
}

LifecycleHandler 在哪里

public class LifecycleHandler  implements Application.ActivityLifecycleCallbacks {

private static LifecycleHandler instance;

public static synchronized LifecycleHandler getInstance() {
    if (instance == null) {
        instance = new LifecycleHandler();
    }

    return instance;
}

private int resumed;
private int paused;
private int started;
private int stopped;

private WeakReference<Activity> activityRef;

public Activity getCurrentActivity() {
    if (activityRef != null) {
        return activityRef.get();
    }

    return null;
}

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}

@Override
public void onActivityDestroyed(Activity activity) {
}

@Override
public void onActivityResumed(Activity activity) {
    ++resumed;
    //Logging.log(TAG, "onActivityResumed application is in foreground: " + (resumed > paused));
    if (started > stopped && resumed > paused) {

    }

    activityRef = new WeakReference<>(activity);
}

@Override
public void onActivityPaused(Activity activity) {
    ++paused;
    //Logging.log(TAG, "onActivityPaused application is in foreground: " + (resumed > paused));
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}

@Override
public void onActivityStarted(Activity activity) {
    ++started;
    //Logging.log(TAG, "onActivityStarted application is visible: " + (started > stopped));
}

@Override
public void onActivityStopped(Activity activity) {
    ++stopped;
    //Logging.log(TAG, "onActivityStopped application is visible: " + (started > stopped));

    if (isInBackground()) {
    }
}

public boolean isInBackground() {
    return started <= stopped && resumed <= paused;
}

}

我们需要在 App 类中注册 Lifecycle:

        registerActivityLifecycleCallbacks(LifecycleHandler.getInstance());
于 2017-12-01T11:42:08.890 回答