【问题标题】:Storing and initializing universally used values for an android App (example: Screen density)存储和初始化 android App 的通用值(例如:屏幕密度)
【发布时间】:2019-05-30 06:16:02
【问题描述】:

我对 Android 编程很陌生,所以如果这是错误的做法,请随时评论我的不良做法。

在我的应用程序中,我有使用相同值的不同活动。此外,我有一些具有静态方法的类,用于多个活动。例如从“URL”生成 ImageViews。

我会在几乎所有应用程序中使用的值之一是这个 sn-p:(取自 another question on SO

getApplicationContext().getResources().getDisplayMetrics().density

例如,每个活动都需要此特定值。但同样的任务也需要它。所以我使用了一个静态类,该类具有该任务的适当方法。但是,该静态类显然没有“getApplicatioContext”。所以我需要将值存储在其他地方。

我的问题是,是否有指定的或至少是最佳或干净的方式来存储这些值并在应用启动时对其进行初始化?

据我了解,我可以使用启动活动的“onCreate”方法并初始化一些静态类或类似的东西。但是,这对我来说似乎有点脏。也许比启动活动的 onCreate() 有一些“更早”的时间,并且比自定义静态(或单例)类存储值更好?

【问题讨论】:

    标签: android android-studio optimization


    【解决方案1】:

    当我们不确切地知道您想要完成的总体目标时,很难确切地告诉您最佳实践是什么,但我有一点要说明,我认为它足够抽象,可以与此处相关。

    始终使用当前的Context。不要存储 Context 或以其他方式尝试“绕过”必须将 Context 参数传递给方法。

    (当然总有例外,但这是一个很好的经验法则。)

    在这种特殊情况下,我建议使用静态辅助方法创建一个类:

    public class MyUtils {
    
        private MyUtils() {
            throw new UnsupportedOperationException("static methods only");
        }
    
        public static float getDisplayDensity(Context context) {
            return context.getResources().getDisplayMetrics().density;
        }
    }
    

    您可以像这样从任何Activity 调用它:

    float density = MyUtils.getDisplayDensity(this);
    

    或来自任何FragmentView,如下所示:

    float density = MyUtils.getDisplayDensity(getContext());
    

    通常,当人们发布有关DisplayMetrics 和密度的问题时,他们真正想做的是将dp 单位转换为px 单位。例如,他们知道他们想要的东西是48dp,但他们需要将一个像素值传递给某个 Android 方法,所以他们想乘以显示密度。

    在这些情况下,您最好使用dimen 资源。你可以定义:

    <dimen name="my_dimension">48dp</dimen>
    

    然后您可以通过调用以px 为单位轻松获取它

    getResources().getDimensionPixelSize(R.dimen.my_dimension);
    

    【讨论】:

    • 感谢您的回答!但是,我还有一个后续问题。密度之类的东西因设备而异,对吧?静态声明的“dimen”到底有什么帮助?
    • dp 单位是“与密度无关的像素”;在每台设备上,48 dp 应该大约与实际尺寸相同(略小于一厘米),但会根据显示器的密度对应不同数量的物理像素。如果密度是mdpi,48dp == 48px。如果密度是xhdpi,48dp == 96px。当您将资源框架与 dimens 资源一起使用时,此转换会根据当前设备自动为您完成。
    • 非常酷!谢谢!除了跟踪和错误之外,还有其他方法可以在 android studio 中查看尺寸尺寸,例如 48dp,而不需要对我的操作进行一些控制来测试它?
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2021-01-12
    相关资源
    最近更新 更多