无法将TextView添加到LinearLayout

时间:2019-06-09 11:22:16

标签: android

我正在为我的Android课做暑期实验。

在layout_main.xml中,我有:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/main_menu" />

    <fragment
        android:name="tests.tinyplanner.ActivityFragment"
        android:id="@+id/mainActivityFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

在main_menu.xml中,我有:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <tests.tinyplanner.ThemeButton
        android:id="@+id/todoButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/todo_button_title" />

    <tests.tinyplanner.ThemeButton
        android:id="@+id/calendarButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/calendar_button_title" />

    <tests.tinyplanner.ThemeButton
        android:id="@+id/notesButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/notes_button_title" />

</LinearLayout>

对于layout_main.xml,我有一个类:

package tests.tinyplanner;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;

public class MainLayout extends LinearLayout {
    private View todoButton;
    private View calendarButton;
    private View notesButton;

    private LayoutInflater inflater_;
    private View inflateView_;

    private void doInflate(Context context) {
        this.inflater_ = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.inflateView_ = this.inflater_.inflate(R.layout.layout_main, this);

        this.todoButton = this.inflateView_.findViewById(R.id.todoButton);
        this.calendarButton = this.inflateView_.findViewById(R.id.calendarButton);
        this.notesButton = this.inflateView_.findViewById(R.id.notesButton);

    }

    public MainLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.doInflate(context);
    }

    public MainLayout(Context context) {
        this(context, null);
    }

    public View getTodoButton() {
        return  this.todoButton;
    }

    public View getCaldendarButton() {
        return  this.calendarButton;
    }

    public View getNotesButton() {
        return  this.notesButton;
    }
}

我在MainActivity中使用此布局

this.layout = new MainLayout(this);
TextView logoTextView = (TextView)((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.logo_layout, null);
((MainLayout) this.layout).addView(logoTextView);
this.setContentView(this.layout);
this.todoButton = ((MainLayout)this.layout).getTodoButton();
this.todoButton.setOnClickListener(this);
this.calendarButton = ((MainLayout)this.layout).getCaldendarButton();
this.calendarButton.setOnClickListener(this);
this.notesButton = ((MainLayout)this.layout).getNotesButton();
this.notesButton.setOnClickListener(this);

所有按钮均正确显示。问题是logoTextView根本没有显示。 logo_layout像这样:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:text="@string/logo_title"
    android:id="@+id/logoTextView"
    android:theme="@style/LogoTheme"
        android:layout_height="wrap_content" >

</TextView>

LogoTheme是这样的:

<style name="LogoTheme">
    <item name="android:textStyle">bold</item>
    <item name="android:textColor">@color/colorFontButtonDefault</item>
    <item name="android:textAllCaps">true</item>
    <item name="android:ems">80</item>
    <item name="android:textSize">18sp</item>
    <item name="android:gravity">center</item>
    <item name="android:textAlignment" tools:targetApi="17">center</item>
</style>

为什么不显示logoTextView

1 个答案:

答案 0 :(得分:0)

您的代码中发生的事情错了。在进入它之前,让我清除一些概念

1)默认情况下,“线性”布局的方向为“水平”。这意味着所有子视图将根据为每个子视图定义的宽度在线性布局内水平堆叠。

  |   ChildA    |   ChildB |  ChildC  |

2)如果任何一个孩子将宽度定义为“ MATCH_PARENT”,则将不允许在其下方显示其他孩子,就像下面一样

  | ChildA                             | (Not visible) childB | (Not visible) childC|

基于此信息,让我们尝试了解您的问题

第一件事:在MainActivity内部,尝试创建MainLayout的地方,您需要为MainLayout指定方向

this.layout = new MainLayout(this);
((MainLayout)this.layout).setOrientation(LinearLayout.VERTICAL);

这将允许垂直堆叠所有子级,以便我们可以看到所有子级

第二件事:,请在layout_main.xml中,将线性布局的layout_height定义为“ wrap_content”。这将使您的徽标文字显示在屏幕上

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"    
    android:orientation="vertical">

    <include layout="@layout/main_menu" />

    <fragment
        android:name="tests.tinyplanner.ActivityFragment"
        android:id="@+id/mainActivityFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

编辑:(为什么即使从XML设置也需要添加方向)

让我们检查一下MainLayout的创建方式。首先,我们在Activity中创建MainLayout实例。依次在主布局内调用doInflatelayout()。

这样做是在创建线性布局,并在内部填充新的线性布局(通过XML设置方向)

通过查看视图层次结构:

  

MainLayout(父级)

     
    

LinearLayout(XML内包含方向)

         
      

线性布局(具有从XML设置的ThemeButton和Orientation)

    
  

现在,您已经为MainLayout的第一个孩子设置了方向。但是您没有为MainLayout设置方向。

因此,我们在创建MainLayout时需要为其设置Orientation。

希望这对您有帮助