如何动态地将 LinearLayoutCompat 视图添加到现有 xml 布局?

How do I add a LinearLayoutCompat view to an existing xml layout dynamically?

我有一个包含 Texts.My activity 的数据库,顶部有一个 TextView(这应该始终保持完整),下面有一个 RelativeLayout,它将作为我的容器。在我的代码中,一旦 activity(我将在其中动态插入视图)启动,我就会创建一个 LinearLayoutCompact 对象并设置一些属性。然后我将光标处理到 table 数据,并为每个数据库元素创建一个 TextView 并将其添加到 LinearLayoutCompat 对象。最后,我尝试将此对象添加到应用程序崩溃的 RelativeLayout 容器中。我正在使用 LayoutInflater 并将 RelativeLayout 容器视为 ViewGroup(我在做了一些研究后发现了这种方式)。但是,如果我只是在 LinearLayoutCompat 对象上使用 setContentView,它可以正常工作,但也会替换我想要显示的 TextView。以下是我认为需要的文件:

veg_option.xml(我的布局activity)

<?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="match_parent"
    android:orientation="vertical">

    <TextView             <!-- The one I want intact throughout -->
        android:id="@+id/narrowText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Let's narrow down now !"
        android:textSize="20sp"
        android:textColor="@color/wineBrown"
        android:gravity="center"
        android:padding="10dp"
        android:layout_marginTop="30dp"
        android:elevation="4dp"/>
   <RelativeLayout               <!-- Trying to use this as container -->
        android:id="@+id/dataCont"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">

    </RelativeLayout>

</LinearLayout>

VegOptions.java(所有操作都应该发生的 activity)

package com.techpappy.whattoeat;

/**
 * Created by Mehul on 31-05-2017.
 */

import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutCompat;
import android.support.v7.widget.AppCompatTextView;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

import java.util.ArrayList;

public class VegOptions extends AppCompatActivity{

    protected DBSource vegDBSource;
    private Cursor cursor;
    protected ArrayList<String> mTypes;
    LayoutInflater li = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = li.inflate(R.layout.veg_option, null);
    ViewGroup dataConPt = (ViewGroup) findViewById(R.id.dataCont);

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.veg_option);   
        vegDBSource = new DBSource(VegOptions.this);
        disp();
    }

    private void disp()
    {
        vegDBSource.open();
        cursor = vegDBSource.getInfo();
        LinearLayoutCompat linearLayoutCompat = defaultPage(cursor);
       //setContentView(linearLayoutCompat);  Works fine but replaces all
        dataConPt.addView(linearLayoutCompat);
    }
//Here my LinearLayoutCompat object is prepared and returned
    public LinearLayoutCompat defaultPage(Cursor mCursor) {
        LinearLayoutCompat layout = new LinearLayoutCompat(this);
        LinearLayoutCompat.LayoutParams params = new LinearLayoutCompat.LayoutParams(LinearLayoutCompat.LayoutParams.MATCH_PARENT, LinearLayoutCompat.LayoutParams.MATCH_PARENT);
        layout.setLayoutParams(params);
        layout.setGravity(Gravity.CENTER);
        layout.setOrientation(LinearLayoutCompat.VERTICAL);
        mCursor.moveToFirst();  //Each iteration adds one TextView
        do {
            AppCompatTextView defaultText = new AppCompatTextView(this);
            defaultText.setText(mCursor.getString(mCursor.getColumnIndex(DataBaseHelper.COLUMN_TYPES)));
            defaultText.setTextAppearance(getApplicationContext(), R.style.TextFontMain);
            defaultText.setTextSize(30);
            defaultText.setPadding(0,30,0,30);
            final String temp = (String) defaultText.getText();
            defaultText.setGravity(Gravity.CENTER);
            defaultText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                     Toast.makeText(getApplicationContext(), temp, Toast.LENGTH_SHORT).show();
                }
            });
            layout.addView(defaultText);
            mCursor.moveToNext();
        }  while(mCursor.isAfterLast() == false);
        return layout;  //LinearLayoutCompat containing all Texts returned
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        vegDBSource.close();
        overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
    }
}

我之前的问题被否决了,但这次我做了相当多的研究并找到了正确的方法,但我无法在我的独特案例中使用它

堆栈跟踪

6-05 19:32:17.679 3450-3450/com.techpappy.whattoeat E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: com.techpappy.whattoeat, PID: 3450
                                                                       java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.techpappy.whattoeat/com.techpappy.whattoeat.VegOptions}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2567)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                           at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                           at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106)
                                                                           at com.techpappy.whattoeat.VegOptions.<init>(VegOptions.java:33)
                                                                           at java.lang.Class.newInstance(Native Method)
                                                                           at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2557)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                                                                           at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                           at android.os.Looper.loop(Looper.java:154) 
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                           at java.lang.reflect.Method.invoke(Native Method) 

简单地在onCreate()方法中初始化了LayoutInflator、View和ViewGroup,问题就解决了。