我已经读过布局XML文件被解释为Java代码,以这种方式构建View层次结构。
首先,如何以及在何处完成?有人可以将我链接到进行此解释的地方吗?
其次,是否可以在不使用XML文件的情况下创建完整的布局?如果答案是肯定的,那么它有用吗? (它是否优于XML文件)大型应用程序是否可以做到这一点?
答案 0 :(得分:3)
我已经读过布局XML文件被解释为Java代码,以这种方式构建View层次结构。
不是大多数定义的短语"解释为Java代码"。解析XML并用于创建与XML中表示的视图相对应的Java对象。
大概是有人可以将我链接到执行此解释的地方吗?
You are looking for LayoutInflater
。
是否可以在不使用XML文件的情况下创建完整的布局?
不确定
它有用吗?
对于琐碎的用户界面(例如,整个内容视图是WebView
),它更简单,更快一点。
请注意,许多游戏将完全跳过基于Java的UI,使用OpenGL从C / C ++渲染其输出。类似地,混合应用程序框架(例如,PhoneGap)将跳过大多数基于Java的UI工作,因为它们通过Web技术(HTML,CSS,JS等)呈现其UI。
答案 1 :(得分:2)
基本代码将是这样的,我在我的博客上做了:
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);
}
}
答案 2 :(得分:1)
当然有可能。但它有用吗?如果你想以编程方式添加一些元素,它可能是。对于整个UI,我认为由于XML创建的潜力而无用。
示例:Adding LinearLayout programmatically in Android doesn't work
LinearLayout LL = new LinearLayout(this);
LL.setBackgroundColor(Color.CYAN);
LL.setOrientation(LinearLayout.VERTICAL);
LayoutParams LLParams = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
LL.setWeightSum(6f);
LL.setLayoutParams(LLParams);
ImageView ladder = new ImageView(this);
ladder.setImageResource(R.drawable.ic_launcher);
FrameLayout.LayoutParams ladderParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
ladder.setLayoutParams(ladderParams);
FrameLayout ladderFL = new FrameLayout(this);
LinearLayout.LayoutParams ladderFLParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 0);
ladderFLParams.weight = 5f;
ladderFL.setLayoutParams(ladderFLParams);
ladderFL.setBackgroundColor(Color.GREEN);
View dummyView = new View(this);
LinearLayout.LayoutParams dummyParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,0);
dummyParams.weight = 1f;
dummyView.setLayoutParams(dummyParams);
dummyView.setBackgroundColor(Color.RED);
ladderFL.addView(ladder);
LL.addView(ladderFL);
LL.addView(dummyView);
RelativeLayout rl=((RelativeLayout) findViewById(R.id.screenRL));
rl.addView(LL);
一般的purpouse应用程序不会这样做。但是有一些特定的案例对于以编程方式管理UI很有用。
答案 3 :(得分:1)
第一个问题:
XML中的布局是Java对象的集合,例如:LinearLayout
解析为Java中具有方法的类。当您调用findViewById
时,您将获得对该对象的引用,以便您可以调用该视图对象的不同方法。如果您对特定视图的工作原理感到好奇,可以在类名上CMD + Click
并在Android Studio中获取反编译源(对于Windows,密钥将有所不同)。
就XML如何知道该做什么而言,所有android:
相关标签都将被该视图的类称为AttributeSet检索。从这里调用方法来执行相关的操作,例如设置文本大小或向子类添加子视图。
第二个问题:
是的,您可以创建没有XML的布局。您可以执行以下操作:例如从LinearLayout
作为新课程延伸,然后在onCreate
Activity
中将您在该视图中传递到setContentView
而不是布局参考。
这有用吗?在大多数情况下并非如此,使用XML创建视图将更容易阅读和更容易理解(yay图形预览)。如果您需要创建自定义视图,它肯定可以完成,并且有很多理由(例如扩展Button
或LinearLayout
的功能)。
您可以在Google's official documentation中了解有关观看次数的更多信息。
答案 4 :(得分:0)
已创建Android XML文件以简化布局创建。这些文件从Java代码解释并转换为对象。您可以创建自己的类(继承自View,ViewGroups ..)并使用自定义属性扩展XML布局。
有时,从Java代码生成视图会更好,例如,当应用程序需要根据数据模型呈现动态布局时。但是在我看来,使用Java创建所有布局并不是一个好方法(是的,总是可行的)。我能看到的唯一的优点是避免了解析XML的时间,但它并不尊重布局代码组织。
答案 5 :(得分:0)
XML文件被夸大为View
对象,是的。
“如何以及在何处完成” - 取决于您在代码中的位置。
在活动中 - 您会看到setContentView(View v)
或setContentView(int layoutRes)
在片段中 - 您会看到onCreateView
返回View
个对象。一个通常来自LayoutInflater
是否可以在不使用XML文件的情况下创建完整的布局?
不确定。在某些情况下,您不需要编写自己的XML文件 - 来自android.R.layout.*
的预定义文件。例如,ListView和适配器。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(android.R.layout.list_content); // Pre-defined ListView
mListView = (ListView) findViewById(android.R.id.list); // Existing List ID
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); // Item Layout
mListView.setAdapter(mAdapter);
但如果您确实意味着不使用任何XML文件,那么您可以使用类似的内容 - 自己构建View
,然后在setContentView
结束。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
ll.setLayoutParams(lp);
EditText editText = new EditText(this);
Button b = new Button(this);
b.setText("Click Me!");
b.setOnClickListener(null);
ll.addView(editText,
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
ll.addView(b,
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
setContentView(ll);
}
如果答案是肯定的,那么它有用吗? (它是否优于XML文件)大型应用程序是否可以做到这一点?
我想不出它会有用的原因。当然,您可以更好地控制动态视图,但无法使用布局编辑器轻松地将其可视化。
我确信有些大型应用可以执行此操作,但您是否打算构建一个需要大量重复使用自定义视图的大型应用?
答案 6 :(得分:0)
现在可以使用 Jetpack compose 创建 android 声明式 UI,无需 xml