如何在布局 activity_main(sw320dp) 中调用?

Posted

技术标签:

【中文标题】如何在布局 activity_main(sw320dp) 中调用?【英文标题】:How do I call inside the layout 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。你为什么要这样做? 那是什么! 【参考方案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 来膨胀布局。

    获取uri of the resource file:

    String uriPath = "android.resource://" + getPackageName() + "/layout-sw320dp/main_activity";
    Uri uri = Uri.parse(uriPath);
    

    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);
    

    最后将布局设置为内容视图:

    setContentView(layout);
    

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

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

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

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

【讨论】:

以上是关于如何在布局 activity_main(sw320dp) 中调用?的主要内容,如果未能解决你的问题,请参考以下文章

对于不同的屏幕布局,文本大小不会改变?

320dp 用于 android 布局

调整文本以支持多个屏幕

如何正确包含 10" 和 7" 布局

android srudio中activity_main.xml怎么才能将设计的显示程序分为几行

仅在 activity_main 中显示的工具栏项