Add and Remove view component dynamically (Android: add/remove input field and spinner form)
Энэ демо дээр Android Studio ашигласан болно. Шинэ project үүсгэж дотор нь шинэ Activity үүсгэхдээ Empty Activity сонгож үүсгэнэ.
1) Үндсэн xml дэлгэцэн дээр дараах байдлаар компонентуудаа өрнө.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tt">
<ScrollView android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:showDividers="middle"
android:divider="?android:dividerHorizontal"
android:animateLayoutChanges="true"
android:paddingLeft="16dp"
android:paddingRight="16dp" />
<Button
android:text="+ Утас нэмэх"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button2" />
</LinearLayout>
</ScrollView>
<TextView android:id="@android:id/empty"
style="?android:textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="32dp"
android:text="test"
android:textColor="?android:textColorSecondary" />
</FrameLayout>
2) Layout resource file үүсгэх.
row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal"
android:divider="?android:dividerVertical"
android:dividerPadding="15dp"
android:gravity="center"
android:showDividers="middle">
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/spinner1123"
android:layout_weight="1"
android:elevation="1dp" />
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text="Name"
android:ems="10"
android:id="@+id/text1123"
android:layout_weight="1" />
<ImageButton android:id="@+id/delete_button"
android:layout_width="48dp"
android:layout_height="match_parent"
android:background="?android:selectableItemBackground"
android:contentDescription="устгах"
android:src="@android:drawable/btn_dialog" />
</LinearLayout>
3) Системд ашиглах String resource үүсгэнэ. res -> values -> strings.xml
strings.xml
<resources>
<string name="app_name">Миний тест апп</string>
<string name="save">Хадгалах</string>
<string name="save_add">Нэмэх</string>
<string name="save_item">Хадгалах</string>
</resources>
4) Системд ашиглах Menu үүсгэнэ. "res" дээр /mouse right click/ -> New -> Android resouce file. Гарч ирсэн цонхон дээр дараах утгуудыг бөглөнө. File Name: my_menu, Resource type: Menu, Directory name: menu
my_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="@string/save_add"
android:id="@+id/my_add" />
<item android:title="@string/save_item"
android:id="@+id/my_item" />
</menu>
5) Системийн кодыг үндсэн Activity үүсгэхэд хамт үүсдэг default class дээр дараах кодыг бичнэ.
MainActivity.java
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.app.NavUtils;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewGroup mContainerView;
List<String> result = new ArrayList<String>();
private ArrayAdapter<String> dataAdapter;
List<String> spinnerArray = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContainerView = (ViewGroup) findViewById(R.id.container);
spinnerArray.add("MN");
spinnerArray.add("USA");
spinnerArray.add("RU");
spinnerArray.add("CHINA");
result = spinnerArray;
Button mButtonAdd = (Button) findViewById(R.id.button2);
mButtonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
findViewById(android.R.id.empty).setVisibility(View.GONE);
addItem(spinnerArray,0,0);
}
});
readPhone();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.my_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.my_item:
findViewById(android.R.id.empty).setVisibility(View.GONE);
showAlert();
return true;
case R.id.my_add:
findViewById(android.R.id.empty).setVisibility(View.GONE);
addItem(spinnerArray,0,0);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (mContainerView.getChildCount() > 0) {
showAlert();
} else {
super.onBackPressed();
}
}
public void readPhone(){
findViewById(android.R.id.empty).setVisibility(View.GONE);
int[] pNumber = new int[]{
88800011, 88800012, 88800013, 88800014
};
int[] pos = new int[]{
1, 3, 2, 0
};
for(int i =0;i<pNumber.length; i++){
addItem(spinnerArray,pos[i],pNumber[i]);
}
}
private void addItem(List<String> ss, int pos, int num) {
final ViewGroup newView = (ViewGroup) LayoutInflater.from(this).inflate(
R.layout.row, mContainerView, false);
dataAdapter =new ArrayAdapter<String>(newView.getContext(),R.layout.support_simple_spinner_dropdown_item,ss);
EditText f = (EditText) newView.findViewById(R.id.text1123);
if(num == 0)
f.setText(" ");
else
f.setText("" + num);
f.setId(f.generateViewId());
f.requestFocus();
Spinner spin = (Spinner) newView.findViewById(R.id.spinner1123);
spin.setAdapter(dataAdapter);
spin.setId(spin.generateViewId());
spin.setSelection(pos);
mContainerView.addView(newView,0);
newView.findViewById(R.id.delete_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mContainerView.removeView(newView);
if (mContainerView.getChildCount() == 0) {
findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
}
}
});
}
private void showAlert() {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setMessage("Өөрчлөлтийг хадгалах уу?");
List<View> vl = getAllChildren(mContainerView);
String v = " ";
String vv = " ";
for(int i=0; i<vl.size(); i++) {
if (vl.get(i) instanceof EditText) {
v = v + "-" + (((EditText)vl.get(i)).getText()) + ", " ;
}
if (vl.get(i) instanceof Spinner) {
v = v + " " + ((Spinner)vl.get(i)).getSelectedItem().toString();
}
}
final TextView input = new TextView(this);
input.setText(v);
alert.setView(input);
alert.setPositiveButton("Хадгалах", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Toast.makeText(getApplicationContext(), "Хадгаллаа ", Toast.LENGTH_SHORT).show();
//finish();
}
});
alert.setNegativeButton("Болих", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Toast.makeText(getApplicationContext(), "Болив ", Toast.LENGTH_SHORT).show();
//finish();
}
});
AlertDialog dialog = alert.create();
dialog.show();
}
private ArrayList<View> getAllChildren(View v) {
if (!(v instanceof ViewGroup)) {
ArrayList<View> viewArrayList = new ArrayList<View>();
viewArrayList.add(v);
return viewArrayList;
}
ArrayList<View> result = new ArrayList<View>();
ViewGroup viewGroup = (ViewGroup) v;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
ArrayList<View> viewArrayList = new ArrayList<View>();
viewArrayList.add(v);
viewArrayList.addAll(getAllChildren(child));
result.addAll(viewArrayList);
}
return result;
}
}
No comments:
Post a Comment