处理Android Nougat上的密度/字体大小更改

时间:2016-10-21 09:19:57

标签: android fonts size display android-7.0-nougat

我想让我的应用程序与Android Nougat兼容,特别是密度更改和字体大小更改。

我在测试中所做的是:

  • 启动应用程序
  • 将其置于多窗口模式(Pixel C的顶部,纵向模式,模拟器上)
  • 在我的应用程序列表中添加一些过滤器
  • 使用设置应用
  • 更改屏幕后半部分的显示大小或字体大小

如果我不使用清单中的密度值来监听配置更改,它会重新创建我的活动(这不好,因为我有一些过滤器并且我丢失了它们)。 如果我听它们的话,在作为参数传递的newConfig值中,densityDpi值与我使用getResources()得到的值相同.getConfiguration()。densityDpi。

清单上的当前行如下:

android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden|density"

我尝试过这样的事情:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
  // some code
  if(mOldConfiguration != null && newConfig.densityDpi!= mOldConfiguration.densityDpi){
  // Neither densityDpi nor fontScale works, they are always the same
  }

    if(mOldConfiguration != null && newConfig.fontScale != mOldConfiguration.fontScale){
    // I will later have a method which will recreate the activity with my filters saved
        recreate();
    }
    mOldConfiguration = newConfig;
}

我已经听过其他配置更改,但无法弄清楚如何在此方法中检测到更改是密度/字体大小更改。

1 个答案:

答案 0 :(得分:0)

  1. 您可以通过在清单文件中添加此行来收听密度更改:

    $last_title = "";
    for($x=0, $n=count($result); $x < $n; $x++){
          if($last_title != $result[$x]["movie_title"])
          {
                $last_title = $result[$x]["movie_title"];
                echo $last_title.' - <img src="'.$result[$x]["image_url"].'"/>';
          }
          else
                echo '<img src="'.$result[$x]["image_url"].'"/>';
    }
    

    在活动中,您可以在进行更改时获取新配置值:

    android:configChanges="density"
    
  2. 随着字体大小的变化,您可以添加如下代码:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.e("TRUNGDH", newConfig.densityDpi + "<= densityDpi");
    }
    
    android:configChanges="fontScale"