[안드로이드]editText의 데이터를 listview로 추가하기
(구현과정, 작동원리)
메인 액티비티에는 팝업윈도우를 출력할 버튼과 데이터를 삽입할 리스트뷰로 구성되어있다. 팝업윈도우 출력버튼을 클릭 시 팝업윈도우가 나타난다. 팝업윈도우에는 editText와 editText의 값을 리스트뷰로 저장시킬 리스트 생성버튼, 팝업윈도우를 닫는 버튼으로 구성된다.
팝업윈도우를 만들기 위해서는 팝업윈도우 레이아웃 파일을 별도로 추가생성해야 한다.
editText의 값을 arrayList에 add하고, adapter를 notifyDataSetChanged()를 이용해 동기화한다.
<메인 액티비티 레이아웃>
<팝업윈도우 레이아웃>
<프로젝트 구조>
MainActivity.class
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.PopupWindow;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// 팝업창을 닫는 버튼
private Button btnPopupClose;
// 팝업창을 띄우는 버튼
private Button btnPopupLoad;
// 팝업 윈도우
private PopupWindow popupWindow;
// 팝업 레이아웃에 위치한 editTxt
private EditText txtData;
// 팝업 레이아웃에 위치한 리스트 생성버튼
private Button btnData;
// 리스트뷰
private ListView listPopup;
// 데이터를 저장할 리스트
List list = new ArrayList<>();
ArrayAdapter adapter;
private int mWidthPixel = 0;
private int mHeightPixel = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 윈도우 매니저, displayMetrics : 가로와 세로길이를 지정하기 위해
WindowManager wm = getWindowManager(); // 윈도우 매니저 객체
Display dp = wm.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
dp.getMetrics(dm);
mWidthPixel = dm.widthPixels;
mHeightPixel = dm.heightPixels;
// 리스트뷰 객체
listPopup = (ListView) findViewById(R.id.listPopup);
//리스트뷰와 리스트를 연결하기 위해 사용되는 어댑터
adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, list);
//리스트뷰의 어댑터를 지정해준다.
listPopup.setAdapter(adapter);
Button btnPopupLoad = (Button) findViewById(R.id.btnPopupLoad);
btnPopupLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 팝업윈도우를 띄울 메소드 호출
initiatePopupWindow();
}
});
}
// 팝업윈도우 띄움 메소드
private void initiatePopupWindow(){
try{
// Mainactivity.this 권장, 팝업윈도우는 부분화면을 인플레이터 함.
LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 뷰그룹으로 형변환
View layout = inflater.inflate(R.layout.layout_popup, (ViewGroup) findViewById(R.id.popupLayout));
// focusable은 팝업윈도우를 실행시켰을 때 윈도우상의 아이템에 초점을 둘지 말지..
popupWindow = new PopupWindow(layout, mWidthPixel-100, mHeightPixel-500, true);
// 팝업윈도우 위치, 숫자값을 임의로 준다면 center에서 숫자값만큼 이동
popupWindow.showAtLocation(layout, Gravity.CENTER, 0,0);
// 팝업윈도우에 위치한 버튼을 사용할땐 뷰.findViewById로 해줌.
btnPopupClose = (Button) layout.findViewById(R.id.btnPopupClose);
btnPopupClose.setOnClickListener(disListener);
// 팝업윈도우에 위치한 editText, 리스트 생성 button
txtData = (EditText) layout.findViewById(R.id.txtData);
btnData = (Button) layout.findViewById(R.id.btnData);
btnData.setOnClickListener(addListener);
}
catch (Exception e){
e.printStackTrace();
}
}
// popupWindow dismiss 리스너
private View.OnClickListener disListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
}
};
// btnData, 리스트 생성버튼을 눌렀을 시 적용될 리스너
private View.OnClickListener addListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// editText data를 arrayList에 add함
list.add(txtData.getText().toString());
//리스트뷰 동기화
adapter.notifyDataSetChanged();
}
};
}
activity_main.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">
<Button
android:id="@+id/btnPopupLoad"
android:text="팝업윈도우 출력"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/listPopup"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
layout_popup (팝업윈도우 레이아웃)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/popupLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f00"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="레이아웃이 적용된 팝업창"
android:textSize="24dp"
android:textColor="#ff0"
android:gravity="center"
android:background="#f000"
android:layout_margin="10dp"/>
<EditText
android:id="@+id/txtData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="58dp"
android:gravity="center"
android:hint="리스트에 추가할 텍스트 입력" />
<Button
android:id="@+id/btnData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="132dp"
android:text="리스트 생성" />
<Button
android:id="@+id/btnPopupClose"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Close"
android:layout_margin="10dp"/>
</LinearLayout>
실행결과
반응형
'▶개발 > Android' 카테고리의 다른 글
[안드로이드]액션바(타이틀바), 상태바 없애기 (0) | 2018.09.25 |
---|---|
[안드로이드]DrawerLayout(슬라이드메뉴) 구현하기 (2) | 2018.09.24 |
[Android] 레이아웃 인플레이터(LayoutInflater)란? (1) | 2018.07.11 |
[Android] Dialog Message 기본 만들기 (0) | 2018.07.11 |
안드로이드의 정확한 UI 표현 레이아웃 ScalableLayout (0) | 2018.07.03 |