如何在布局 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
),并带有适当的前缀:
然后在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 文件(drawable
、layout
等 raw
是例外)are encoded 在编译应用程序时(使用 Assets
文件夹 should work)
所以恐怕没有办法做到这一点。
【讨论】:
以上是关于如何在布局 activity_main(sw320dp) 中调用?的主要内容,如果未能解决你的问题,请参考以下文章