Android 单击按钮时生成新视图

Android 单击按钮时生成新视图,android,xml,view,Android,Xml,View,我正在编写一个Android应用程序,使用XML文件动态生成用户界面。XML文件包含每个UI元素的标记。这是文件的一小部分,整个文件太大了,因为要生成很多屏幕 <?xml version="1.0" encoding="UTF-8" ?><form> <title>DataCollectApp</title> <tableName>FormDB</tableName> <!-- ************page 1**

我正在编写一个Android应用程序,使用XML文件动态生成用户界面。XML文件包含每个UI元素的标记。这是文件的一小部分,整个文件太大了,因为要生成很多屏幕

<?xml version="1.0" encoding="UTF-8" ?><form>
<title>DataCollectApp</title>
<tableName>FormDB</tableName>
<!-- ************page 1***************-->
<fields>
    <uiComponentType>label</uiComponentType>
    <displayText>Data Collection</displayText>
    <groupNumber>1</groupNumber>
    <dbName>label1</dbName>
    <required>true</required>
    <font>Helvetica-Bold</font>
    <fontSize>16</fontSize>
</fields>
<fields>
    <uiComponentType>button</uiComponentType>
    <buttonDisplayText>Collect Data</buttonDisplayText>
    <groupNumber>1</groupNumber>
    <navigateToGroup>2</navigateToGroup>
    <selectorFunction>navigate</selectorFunction>
    <dbName>button1</dbName>
    <required>true</required>
    <font>Helvetica-Bold</font>
    <fontSize>14</fontSize>
</fields>
<fields>
    <uiComponentType>button</uiComponentType>
    <buttonDisplayText>Sync</buttonDisplayText>
    <groupNumber>1</groupNumber>
    <navigateToGroup>3</navigateToGroup>
    <selectorFunction>navigate</selectorFunction>
    <dbName>button2</dbName>
    <required>true</required>
    <font>Helvetica-Bold</font>
    <fontSize>14</fontSize>
</fields>
<fields>
    <uiComponentType>button</uiComponentType>
    <buttonDisplayText>History</buttonDisplayText>
    <groupNumber>1</groupNumber>
    <navigateToGroup>4</navigateToGroup>
    <selectorFunction>navigate</selectorFunction>
    <dbName>button3</dbName>
    <required>true</required>
    <font>Helvetica-Bold</font>
    <fontSize>14</fontSize>
</fields>
<fields>
    <uiComponentType>button</uiComponentType>
    <buttonDisplayText>Support Form</buttonDisplayText>
    <groupNumber>1</groupNumber>
    <navigateToGroup>33</navigateToGroup>
    <!--<selectorFunction></selectorFunction>-->
    <dbName>button4</dbName>
    <required>true</required>
    <font>Helvetica-Bold</font>
    <fontSize>14</fontSize>
</fields>


<!-- ************page 2***************-->
    <fields>
        <uiComponentType>labelTextBox</uiComponentType>
        <displayText>Recorder</displayText>
        <groupNumber>2</groupNumber>
        <dbName>labelTextBox1</dbName>
        <required>true</required>
        <inputType>IT_TEXT</inputType>
        <font>Helvetica-Bold</font>
        <fontSize>14</fontSize>
    </fields>
    <fields>
        <uiComponentType>labelTextBox</uiComponentType>
        <displayText>Handler</displayText>
        <hint>enter handler</hint>
        <groupNumber>2</groupNumber>
        <dbName>labelTextBox2</dbName>
        <required>true</required>
        <inputType>IT_TEXT</inputType>
        <font>Helvetica-Bold</font>
        <fontSize>14</fontSize>
    </fields>
</xml>
标记表示视图编号,而标记显示单击按钮时生成的视图。在上面的例子中,当我点击第一个视图中的CollectData按钮时,它将转到第2页下的元素。我能够获得正确的导航,但新视图显示在第一个屏幕下方,而不是上一个屏幕的位置。这是我主要活动的代码

package com.androidxmlparser;

import java.io.FileInputStream;
import java.io.StringReader;
import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.jiteshandroidsaxparser.R;




import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.app.Activity;
import android.view.Menu;

@SuppressLint("InlinedApi")
public class MainActivity extends Activity {

    private TextView xmlOutput;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String parsedData = "";
        try {

                int cnt =0;
                Log.w("AndroidParseXMLActivity", "Start");
                /** Handling XML */
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                XMLReader xr = sp.getXMLReader();

                ItemXMLHandler myXMLHandler = new ItemXMLHandler();
                xr.setContentHandler(myXMLHandler);

                xr.parse(new InputSource(getAssets().open("data.xml")));
                final ArrayList<ItemMaster> itemsList = myXMLHandler.getItemsList();

                //xmlOutput.setText(parsedData);
                //main.addView(xmlOutput);  
                final LinearLayout main=(LinearLayout) findViewById(R.id.main);

                cnt = 1;
                //final ItemMaster item = itemsList.get(cnt);
                    //final LinearLayout main=(LinearLayout) findViewById(R.id.main);
                LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(200, LinearLayout.LayoutParams.WRAP_CONTENT );

                xmlOutput = (TextView) findViewById(R.id.xmlOutput);

                for(int i = 1; i <= itemsList.size(); i++)
                {
                    cnt = i;
                    ItemMaster item = itemsList.get(cnt);
                    int pageNumber = item.getgroupNumber();
                    if(pageNumber == 1)
                    {
                        String compType = item.getuiComponentType();                    
                        //parsedData = parsedData + compType;

                        //xmlOutput.setText(parsedData);
                        if(compType.equals("button"))
                        {
                            createButtons(main,p,item,itemsList);
                        }

                        else if(compType.equalsIgnoreCase("label"))
                        {
                            createLabels(main,p,item,itemsList);
                        }

                        else if(compType.equals("labelTextBox"))
                        {
                            createTextFields(main,p,item,itemsList);
                        }       

                        //generateInterface(main,p,item,1,itemsList);
                    }
                }
                main.addView(xmlOutput);
                 Log.w("AndroidParseXMLActivity", "Done");  
        }catch (Exception e) {
            Log.w("AndroidParseXMLActivity", e);
            }       
    }

    public void createButtons(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, ArrayList<ItemMaster> itemsList)
    {
        Button buttonView = new Button(this);
        String buttonText = item.getbuttonDisplayText();
        buttonView.setText(buttonText);
        //buttonView.setText(buttonText);type name = new type(arguments);
        final int targetPage = item.getnavigateToGroup();
        final LinearLayout submain = main;
        final LinearLayout.LayoutParams subp = new LinearLayout.LayoutParams(200, LinearLayout.LayoutParams.WRAP_CONTENT );;
        final ItemMaster subItem = item;
        final ArrayList<ItemMaster> subitemsList = itemsList;
        buttonView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click
                for (ItemMaster it : subitemsList)
                {
                    if(subItem.navigateToGroup == it.groupNumber)
                    {
                        generateInterface(submain,subp,it,targetPage,subitemsList);
                        TextView view =new TextView(MainActivity.this);   
                        view.setLayoutParams(subp);
                        submain.addView(view,subp); 
                        //submain.addView(v);
                    }
                }               
            }
        });
        main.addView(buttonView, p);
    }

    public void generateInterface(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, int pgNum, ArrayList<ItemMaster> itemsList)
    {
            String compType = item.getuiComponentType();                    
            //parsedData = parsedData + compType;

            //xmlOutput.setText(parsedData);
            if(compType.equals("button"))
            {
                createButtons(main,p,item,itemsList);
            }

            else if(compType.equalsIgnoreCase("label"))
            {
                createLabels(main,p,item,itemsList);
            }

            else if(compType.equals("labelTextBox"))
            {
                createTextFields(main,p,item,itemsList);
            }       
    }
    public void createLabels(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, ArrayList<ItemMaster> itemsList)
    {
        TextView labelView = new TextView(this);
        String labelText = item.getdisplayText();
        labelView.setText(labelText);
        //buttonView.setText(buttonText);
        main.addView(labelView, p);
    }

    public void createTextFields(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, ArrayList<ItemMaster> itemsList)
    {
        TextView inputLabel = new TextView(this);
        String inputLabelText = item.getdisplayText();
        inputLabel.setText(inputLabelText);
        main.addView(inputLabel, p);

        EditText textBox = new EditText(this);
        textBox.setWidth(5);
        main.addView(textBox, p);
    }
}

如果我在提出问题时犯了任何错误,我会提前道歉。我知道,单击按钮时将创建一个新视图,该视图稍后将使用新的布局参数添加到主布局中。

如果您的主线布局只能容纳一个子视图,则可以执行以下操作:

main.removeAllViews();
main.addView(xmlOutput);

如果你想替换UI的某些部分,我想你正在寻找Fragment。我看了Fragment文档。虽然我认为这是有用的,但我认为这对我的案例不起作用。稍后,我将存储每个视图的数据,本地sqlite数据库中只有按钮的视图除外。为此,我想我必须生成一个新视图,我知道当单击按钮时,它将是一个子视图。我添加了一个答案。我仍然认为在这里使用片段是正确的,也许你应该多看看。谢谢!我确实按照你的建议使用了碎片,而且效果很好!它的重量也非常轻,我能够轻松地在屏幕上保存信息。感谢您的回复!我按照你的建议进行了编辑,但是,它仍然在第一个视图下面生成第二个视图。我还将进一步研究碎片!