簡體   English   中英

如何動態地將LinearLayoutCompat視圖添加到現有xml布局?

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

我有一個包含Texts的數據庫。我的活動在頂部有一個TextView(在整個過程中應該始終保持不變),在其下面有一個RelativeLayout,它將作為我的容器。 在我的代碼中,活動(將在其中動態插入視圖)啟動后,我將創建一個LinearLayoutCompact對象並設置一些屬性。 然后,我將光標處理到表數據,並為每個數據庫元素創建一個TextView並將其添加到LinearLayoutCompat對象。 最后,我嘗試將該對象添加到應用崩潰的RelativeLayout容器中。 我正在使用LayoutInflater並將RelativeLayout容器作為ViewGroup處理(我在做一些研究后發現了這種方式)。 但是,如果我只是在LinearLayoutCompat對象上使用setContentView,則它可以正常工作,但也可以替換我想要顯示的TextView。 這是我認為必要的文件:

veg_option.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="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 (應該執行所有操作的活動)

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,即可解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM