我曾读到过布局XML文件被解释为Java代码,以这种方式构建视图层次结构。 大多数“解释为Java代码”的定义都不是这样。XML被解析并用于创建与XML中表达的视图相对应的Java对象。 有人能把我和做这种解释的地方联系起来吗? You are looking for LayoutInflater,大概吧。 不使用XML文件是否可以创建一个完整的布局? 当然可以。 有什么用吗? 对于简单的UI(例如,整个内容视图是WebView),它更简单,速度也更快。 请注意,许多游戏将完全跳过基于Java的UI,使用OpenGL从C/C++渲染其输出。同样,混合应用程序框架(例如PhoneGap)将跳过大部分基于Java的UI工作,因为它们通过Web技术(HTML,CSS,JS等)渲染其UI。
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// creating LinearLayout
LinearLayout linLayout = new LinearLayout(this);
// specifying vertical orientation
linLayout.setOrientation(LinearLayout.VERTICAL);
// creating LayoutParams
LayoutParams linLayoutParam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
// set LinearLayout as a root element of the screen
setContentView(linLayout, linLayoutParam);
LayoutParams lpView = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
TextView tv = new TextView(this);
tv.setText("TextView");
tv.setLayoutParams(lpView);
linLayout.addView(tv);
Button btn = new Button(this);
btn.setText("Button");
linLayout.addView(btn, lpView);
LinearLayout.LayoutParams leftMarginParams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
leftMarginParams.leftMargin = 50;
Button btn1 = new Button(this);
btn1.setText("Button1");
linLayout.addView(btn1, leftMarginParams);
LinearLayout.LayoutParams rightGravityParams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
rightGravityParams.gravity = Gravity.RIGHT;
Button btn2 = new Button(this);
btn2.setText("Button2");
linLayout.addView(btn2, rightGravityParams);
}
}
是的,你可以创建一个没有XML的布局。你可以做一些事情,比如从LinearLayout扩展一个新的类,然后在你的Activity的onCreate中,你会把那个视图传递到setContentView中,而不是布局引用。 这有用吗?在大多数情况下,使用XML创建视图将更容易阅读和理解(耶图形预览)。如果您需要创建自定义视图,它肯定可以完成,并且有很多理由这样做(例如扩展Button或LinearLayout的功能)。 您可以在Google's official documentation中阅读更多关于视图的信息。
8条答案
按热度按时间nr7wwzry1#
我曾读到过布局XML文件被解释为Java代码,以这种方式构建视图层次结构。
大多数“解释为Java代码”的定义都不是这样。XML被解析并用于创建与XML中表达的视图相对应的Java对象。
有人能把我和做这种解释的地方联系起来吗?
You are looking for
LayoutInflater
,大概吧。不使用XML文件是否可以创建一个完整的布局?
当然可以。
有什么用吗?
对于简单的UI(例如,整个内容视图是
WebView
),它更简单,速度也更快。请注意,许多游戏将完全跳过基于Java的UI,使用OpenGL从C/C++渲染其输出。同样,混合应用程序框架(例如PhoneGap)将跳过大部分基于Java的UI工作,因为它们通过Web技术(HTML,CSS,JS等)渲染其UI。
tct7dpnv2#
一个基本的代码将是这样的,我在我的博客上做了:
kokeuurv3#
*是否可以不使用XML文件创建完整的布局?
当然这是可能的。但是它有用吗?如果你想以编程的方式添加一些元素,它可能有用。对于整个UI,我认为由于XML创建的潜力,它没有用处。
示例:Adding LinearLayout programmatically in Android doesn't work
*大型应用程序会这样做吗?
一般用途的应用程序不会这样做,但有一些特定的情况下,是有用的程序化管理的UI。
bcs8qyzn4#
第一个问题:
XML中的布局是Java对象的集合,例如:
LinearLayout
解析为Java中一个具有方法的类。当您调用findViewById
时,您将获得该对象的引用,以便您可以调用该视图对象的不同方法。如果您对特定视图的工作方式感到好奇,您可以在类名上执行CMD + Click
,并在Android Studio中获取反编译的源代码(Windows的密钥将有所不同)。就XML如何知道要做什么而言,所有与
android:
相关的标记都将由该视图的名为AttributeSet的类检索。从这里调用方法来做相关的事情,例如设置文本大小或向类添加子视图。第二个问题:
是的,你可以创建一个没有XML的布局。你可以做一些事情,比如从
LinearLayout
扩展一个新的类,然后在你的Activity
的onCreate
中,你会把那个视图传递到setContentView
中,而不是布局引用。这有用吗?在大多数情况下,使用XML创建视图将更容易阅读和理解(耶图形预览)。如果您需要创建自定义视图,它肯定可以完成,并且有很多理由这样做(例如扩展
Button
或LinearLayout
的功能)。您可以在Google's official documentation中阅读更多关于视图的信息。
enxuqcxy5#
创建Android XML文件是为了简化布局创建。这些文件从Java代码解释并转换为对象。您可以创建自己的类(继承自View,ViewGroups..)并使用自定义属性扩展XML布局。
有时候从Java代码中生成视图会更好,例如当应用程序需要根据数据模型呈现动态布局时。但在我看来,使用Java创建所有布局并不是一个好方法(是的,总是可能的)。我能看到的唯一优点是避免了解析XML的时间,但这与布局代码组织无关。
dgtucam16#
XML文件被膨胀成一个
View
对象,是的。“* 如何以及在何处完成 *”--取决于您在代码中的位置。
在Activity中-您将看到
setContentView(View v)
或setContentView(int layoutRes)
在片段中--您将看到
onCreateView
返回一个View
对象。不使用XML文件是否可以创建一个完整的布局?
当然可以。在某些情况下,你不需要自己写XML文件--
android.R.layout.*
中有预定义的XML文件。例如,一个ListView和一个适配器。但是如果您的意思是不使用任何XML文件,那么您可以使用这样的东西-自己构建一个
View
,然后在最后构建setContentView
。如果答案是肯定的,它在任何方面都有用吗?(它比XML文件有优势吗?)大型应用程序会这样做吗?
我想不出它有用的理由。当然,你可以对动态视图有更多的控制,但是你不能用布局编辑器轻松地将它们可视化。
我相信有些大型应用程序可能会这样做,但您是否计划构建一个需要大量重用自定义视图的大型应用程序?
kmb7vmvb7#
现在可以使用Jetpack compose创建android声明式UI,无需使用xml
https://developer.android.com/jetpack/compose
uinbv5nw8#
您可以使用此库创建所有UI,该库基于Android视图系统,而无需声明式的xml文件。
https://github.com/kaiserdavar/AndroidUI