【问题标题】:How do I call inside the layout activity_main(sw320dp)?如何在布局 activity_main(sw320dp) 中调用?
【发布时间】:2022-01-05 01:23:08
【问题描述】:

我要调用灰色(sw320dp)布局文件

布局:-activity_main(sw320dp)

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main(sw320dp));
 }
}

【问题讨论】:

  • 所有布局都是根据设备分辨率(高度和宽度)设计的。每个布局都将被自动调用,无论哪个与配置匹配。您无需明确执行任何操作即可显示特定的布局文件
  • 它将根据设备分辨率自动调用。如果您想调用相同的布局:-activity_main(sw320dp),那么您需要删除所有其他布局,例如 Layout:-activity_main(sw600dp),Layout:- activity_main(sw480dp) 等然后它会自动调用布局:- activity_main(sw320dp)
  • 但我想调用activity_main(sw320dp)布局支持所有设备正如我们在java代码中展示的那样
  • 有一种方法可以实现这一点,但它有点 hacky。你为什么要这样做?
  • 那是什么!

标签: java android android-studio android-layout


【解决方案1】:

建议使用resource qualifiers,但有办法在代码中实现。

您可以将所有布局放在同一个文件夹中(例如文件夹layout),并带有适当的前缀:

  • activity_main_base.xml
  • activity_main_svga.xml
  • activity_main_sw320dp.xml
  • (其他布局……)

然后在onCreate,你只需要得到你想要的:

setContentView(R.layout.activity_main_sw320dp));

现在,如果您需要根据屏幕指标选择布局……

screen size:

   int screenLayout = context.getResources().getConfiguration().screenLayout 
                          &= Configuration.SCREENLAYOUT_SIZE_MASK;

   switch (screenLayout) {
     case Configuration.SCREENLAYOUT_SIZE_SMALL:
        // small
        break;
     case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        // normal
        break;
     case Configuration.SCREENLAYOUT_SIZE_LARGE:
        // large
        break;
     case Configuration.SCREENLAYOUT_SIZE_XLARGE:
        // xlarge
        break;
     default:
        // undefined
        break;
   }

screen density:

   int density = context.getResources().getDisplayMetrics().densityDpi;

   switch (density) {
     case DisplayMetrics.DENSITY_LOW:
        // low ldpi
        break;
     case DisplayMetrics.SCREENLAYOUT_SIZE_NORMAL:
        // medium mdpi
        break;
     case DisplayMetrics.SCREENLAYOUT_SIZE_LARGE:
        // high hdpi
        break;
     case …:
        // other densities (xhdpi, xxhdpi,…)
        break;
     default:
        // undefined
        break;
   }

您可以使用其他一些,如屏幕宽度或高度,并根据需要组合它们。


编辑: 直接使用资源文件不可能。以下是研究:

想法是尝试从资源路径手动获取文件,然后使用XmlPullParser 来膨胀布局。

  1. 获取uri of the resource file

    String uriPath = "android.resource://" + getPackageName() + "/layout-sw320dp/main_activity";
    Uri uri = Uri.parse(uriPath);
    
  2. Setup the XmlPullParser 对象并将 uri 传递给它:

    XmlPullParser parser = Xml.newPullParser();
    
    try {
    InputStream in = getContentResolver().openInputStream(uri);
    
    parser.setInput(in, "UTF-8");
    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
    parser.setFeature(XmlPullParser.FEATURE_VALIDATION, true);
    parser.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, true);
    } catch (Exception e) {
    }
    
    View layout = LayoutInflater.from(this).inflate(parser, null);
    
  3. 最后将布局设置为内容视图:

    setContentView(layout);
    

但是运行这段代码会抛出一个InflateException:

InflateException: Unexpected token (position:TEXT ������������P����...@3:312 in java.io.InputStreamReader@4009b5d)

这是因为资源文件夹中的 xml 文件(drawablelayoutraw 是例外)are encoded 在编译应用程序时(使用 Assets 文件夹 should work

所以恐怕没有办法做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多