简体   繁体   English

Android-在Java布局内插入布局

[英]Android - insert layout inside layout in java

im begginer in android programming and i dont understand much how views and inflatting work. 我在Android编程中开始,我不太了解视图和膨胀的工作方式。 this is what i want to do: i want to have one main layout that includes another layout. 这就是我想要做的:我想要一个主布局,其中包括另一种布局。 this "another" layout i want to programmically change in java and in main activity to include it in main layout. 我想在Java和主要活动中以编程方式更改此“另一个”布局,以将其包括在主布局中。

i have activity_main.xml 我有activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 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"
        tools:context="blahblah.MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />



        </android.support.design.widget.AppBarLayout>

        <LinearLayout

<!--here i want to include another layout-->
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/main_content"
            android:orientation="horizontal"></LinearLayout>

        <!--
            <include layout="@layout/content_main" />
        -->

    </android.support.design.widget.CoordinatorLayout>

inside linear layout main_content i want to include kalendar_view.xml 内部线性布局main_content我想包括kalendar_view.xml

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

    <TextView
        android:id="@+id/textView11"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />
</LinearLayout>

and this is my MainActivity.java 这是我的MainActivity.java

public class MainActivity extends AppCompatActivity {

    TextView tv;
    LinearLayout mainContent;
    KalendarView kv;
    Context context;
    LayoutInflater inflater;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inflater=getLayoutInflater();
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        mainContent=(LinearLayout) findViewById(R.id.main_content);
        kv = new KalendarView(context, inflater);//this view i want to include in main layout
        mainContent.addView(kv);//trying to include
        setSupportActionBar(toolbar);
        tv= (TextView) findViewById(R.id.textView11);
    }
(...)

and KalendarView.java 和KalendarView.java

  public class KalendarView extends LinearLayout {

       // LayoutInflater inflater;

        public KalendarView(Context context, LayoutInflater inflater){
            super(context);
           // inflater = (LayoutInflater)context.getSystemService
           //         (Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(R.layout.kalendar_view, null);//trying to inflate
        }
//(...) some methods to programically change layout
    }

this app crashes, and i dont know why. 这个应用程序崩溃了,我不知道为什么。 my goal is to have more than one different instances of KalendarView class so that i can programically show one of them. 我的目标是拥有多个KalendarView类的不同实例,以便我可以以编程方式显示其中之一。

can someone explain me what is wrong with my code, and how to correctly include one layout inside another? 有人可以向我解释我的代码有什么问题,以及如何正确地将一种布局包含在另一种布局中吗?

Your KalendarView shouldn't have an inflator as a parameter, and definitely shouldn't try to inflate itself. 您的KalendarView不应将充气机作为参数,并且绝对不应尝试自行充气。 Your Kalendar view should look something like this: 您的Kalendar视图应如下所示:

  public class KalendarView extends LinearLayout {
        public KalendarView(Context context){
            super(context);
        }
//(...) some methods to programically change layout
    }

This is enough to be able to instantianate a view. 这足以实例化视图。 IN your Main Activity you forgot to instantaniate your mainContent. 在您的主要活动中,您忘记了实例化mainContent。 It should look something like this: 它看起来应该像这样:

public class MainActivity extends AppCompatActivity {

TextView tv;
LinearLayout mainContent;
KalendarView kv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mainContent = (LinearLayout) findViewById(R.id.main_content);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    kv = new KalendarView(MainActivity.this);
    mainContent.addView(kv);
    setSupportActionBar(toolbar);
    tv= (TextView) findViewById(R.id.textView11);
}

(...) (......)

The thing is, you need to attach it to root, like this 问题是,您需要像这样将其附加到根目录

private void initView() {
    LayoutInflater.from(getContext()).inflate(R.layout.kalendar_view, this, true);
}

So your class should look like this: 因此,您的课程应如下所示:

public class KalendarView extends LinearLayout {

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

public KalendarView(Context context,
                     @Nullable AttributeSet attrs) {
    super(context, attrs);
    initView();
}

public KalendarView(Context context,
                     @Nullable AttributeSet attrs,
                     int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initView();
}

private void initView() {
    LayoutInflater.from(getContext()).inflate(R.layout.kalendar_view, this, true);
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM