简体   繁体   中英

Generating a new View when a button is clicked Android

I am writing an Android application generate user interfaces dynamically using an XML file. The XML file contains tags for each UI element. Here is a small part of the file (the whole file is too large since there are a lot of screens to be generated

<?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>

The <groupNumber> tag denotes the view number while the <navigateToGroup> tag shows which view is generated when the button is clicked. In the above example, when I click on button which says Collect Data in the first View, it will go to the elements under page 2. I am able to get the right navigation, but the new View appears below the first screen and not in place of the previous screen. Here is the code of my main activity.

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);
    }
}

I apologize in advance if I have made any mistakes in asking my question. I know that a new view is to be created when the button is clicked, and that view is to be later added to the main layout with the new layout parameters.

If your "main" LinearLayout is only mean to hold one child, you can do this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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