在没有XML的情况下创建布局

时间:2016-09-15 15:41:50

标签: android

我已经读过布局XML文件被解释为Java代码,以这种方式构建View层次结构。

首先,如何以及在何处完成?有人可以将我链接到进行此解释的地方吗?

其次,是否可以在不使用XML文件的情况下创建完整的布局?如果答案是肯定的,那么它有用吗? (它是否优于XML文件)大型应用程序是否可以做到这一点?

7 个答案:

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

Dummy

答案 2 :(得分:1)

  • 是否可以在不使用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);
  • 大型应用是否会这样做?

一般的purpouse应用程序不会这样做。但是有一些特定的案例对于以编程方式管理UI很有用。

答案 3 :(得分:1)

第一个问题

XML中的布局是Java对象的集合,例如:LinearLayout解析为Java中具有方法的类。当您调用findViewById时,您将获得对该对象的引用,以便您可以调用该视图对象的不同方法。如果您对特定视图的工作原理感到好奇,可以在类名上CMD + Click并在Android Studio中获取反编译源(对于Windows,密钥将有所不同)。

就XML如何知道该做什么而言,所有android:相关标签都将被该视图的类称为AttributeSet检索。从这里调用方法来执行相关的操作,例如设置文本大小或向子类添加子视图。

第二个问题

是的,您可以创建没有XML的布局。您可以执行以下操作:例如从LinearLayout作为新课程延伸,然后在onCreate Activity中将您在该视图中传递到setContentView而不是布局参考。

这有用吗?在大多数情况下并非如此,使用XML创建视图将更容易阅读和更容易理解(yay图形预览)。如果您需要创建自定义视图,它肯定可以完成,并且有很多理由(例如扩展ButtonLinearLayout的功能)。

您可以在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

https://developer.android.com/jetpack/compose