android 创建没有XML的布局

laximzn5  于 2023-04-28  发布在  Android
关注(0)|答案(8)|浏览(251)

我曾读到过布局XML文件被解释为Java代码,以这种方式构建视图层次结构。
首先,这是如何和在哪里做的?有人能把我链接到做这种解释的地方吗?
第二,是否可以不使用XML文件来创建一个完整的布局?如果答案是肯定的,它在任何方面都有用吗?(它是否比XML文件有优势)大型应用程序会这样做吗?

nr7wwzry

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。

tct7dpnv

tct7dpnv2#

一个基本的代码将是这样的,我在我的博客上做了:

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

kokeuurv

kokeuurv3#

*是否可以不使用XML文件创建完整的布局?

当然这是可能的。但是它有用吗?如果你想以编程的方式添加一些元素,它可能有用。对于整个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);

*大型应用程序会这样做吗?

一般用途的应用程序不会这样做,但有一些特定的情况下,是有用的程序化管理的UI。

bcs8qyzn

bcs8qyzn4#

第一个问题

XML中的布局是Java对象的集合,例如:LinearLayout解析为Java中一个具有方法的类。当您调用findViewById时,您将获得该对象的引用,以便您可以调用该视图对象的不同方法。如果您对特定视图的工作方式感到好奇,您可以在类名上执行CMD + Click,并在Android Studio中获取反编译的源代码(Windows的密钥将有所不同)。
就XML如何知道要做什么而言,所有与android:相关的标记都将由该视图的名为AttributeSet的类检索。从这里调用方法来做相关的事情,例如设置文本大小或向类添加子视图。

第二个问题

是的,你可以创建一个没有XML的布局。你可以做一些事情,比如从LinearLayout扩展一个新的类,然后在你的ActivityonCreate中,你会把那个视图传递到setContentView中,而不是布局引用。
这有用吗?在大多数情况下,使用XML创建视图将更容易阅读和理解(耶图形预览)。如果您需要创建自定义视图,它肯定可以完成,并且有很多理由这样做(例如扩展ButtonLinearLayout的功能)。
您可以在Google's official documentation中阅读更多关于视图的信息。

enxuqcxy

enxuqcxy5#

创建Android XML文件是为了简化布局创建。这些文件从Java代码解释并转换为对象。您可以创建自己的类(继承自View,ViewGroups..)并使用自定义属性扩展XML布局。
有时候从Java代码中生成视图会更好,例如当应用程序需要根据数据模型呈现动态布局时。但在我看来,使用Java创建所有布局并不是一个好方法(是的,总是可能的)。我能看到的唯一优点是避免了解析XML的时间,但这与布局代码组织无关。

dgtucam1

dgtucam16#

XML文件被膨胀成一个View对象,是的。
“* 如何以及在何处完成 *”--取决于您在代码中的位置。
在Activity中-您将看到setContentView(View v)setContentView(int layoutRes)
在片段中--您将看到onCreateView返回一个View对象。
不使用XML文件是否可以创建一个完整的布局?
当然可以。在某些情况下,你不需要自己写XML文件--android.R.layout.*中有预定义的XML文件。例如,一个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文件有优势吗?)大型应用程序会这样做吗?
我想不出它有用的理由。当然,你可以对动态视图有更多的控制,但是你不能用布局编辑器轻松地将它们可视化。
我相信有些大型应用程序可能会这样做,但您是否计划构建一个需要大量重用自定义视图的大型应用程序?

kmb7vmvb

kmb7vmvb7#

现在可以使用Jetpack compose创建android声明式UI,无需使用xml
https://developer.android.com/jetpack/compose

uinbv5nw

uinbv5nw8#

您可以使用此库创建所有UI,该库基于Android视图系统,而无需声明式的xml文件。
https://github.com/kaiserdavar/AndroidUI

相关问题