이미지와 텍스트가 포함된 커스텀 리스트뷰를 안드로이드의 다이어로그(alertdialog)에 보여주는 예제입니다.
리스트뷰에서 항목을 선택시 액티비티의 뷰에 선택한 항목을 보여주도록 구현되었습니다.
다음처럼 실행됩니다.
1. 실행하면 텍스트뷰와 버튼을 보여줍니다. 버튼을 클릭하면 다이얼로그가 보이게 됩니다.
![](https://lh4.googleusercontent.com/ivWwxN7vFehVAdigxpRq05ArK7GBuiFaHP1HymwHSVcVFjlgDIr9l-sRhSIBkCEi8X5Y7CpInABibUn-ttJTseL49dw8Z57Q6BQL-k2d2srnNnBBvv3UdNqHqEoKd8YG2Qo-ZgaE)
2. 다이얼로그에 추가된 리스트뷰상에 선택할 수 있는 항목이 보입니다.
![](https://lh3.googleusercontent.com/FQuz5hXNagWCNJ-zdRVkf2U5WPARIuSikwmM9QvyxDDgwf2wJiA-2pTSRQTb91vLwxYq73HeK896hytSL6YdjQETp5zVT6KZYAJ0G4X-BU7at3UVTa0rDpKodEPTlqCC4W6JgQTw)
3. 다이얼로그에서 선택한 항목이 텍스트뷰에 보여집니다.
![](https://lh5.googleusercontent.com/W-fvvUaJD5mP7i7iafvSEAcNZXJ_PDbSKXeT4aP0JUMm862jTjYd--8fhppOU7Todfek4CTOm6eAA9gX-Fv5TJsyIC2UR899TUPwpCifLav8kwgZaFtYpUrdr0Cki88SsoOVoxDx)
다음처럼 예제를 테스트할 수 있습니다.
0. 프로젝트 창의 drawable 폴더에 이미지를 추가합니다. 다이얼로그의 항목 옆에 보여줄 이미지입니다.
본 글에서는 SVG 이미지를 사용하였습니다.
![](https://lh6.googleusercontent.com/4SgsOG6nwlVnxCv41bWoG2CA0DqAseJ3fP6muzG0-qQl6Oq5mNJr8D37uwiaUXaKy18H5aekivRhbmQOgQ2cB4O0UYRxwRM0Kvjuqu9iPp4jaxUO1LXQ_s84IIh4egOtX2GHhKwm)
1. activity_main.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="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity">
<TextView android:id="@+id/textview_main_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="아직 선택하지 않았습니다."/>
<Button android:id="@+id/button_main_run" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="선택"/>
</LinearLayout> |
2. alert_dialog.xml
다이얼로그에 보여줄 레이아웃입니다. CardView를 사용하여 다이얼로그의 모서리가 둥글게 보이도록 합니다.
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" card_view:cardCornerRadius="20dp" card_view:cardUseCompatPadding="true">
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:orientation="vertical">
<TextView android:id="@+id/textview_alterdialog_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:layout_margin="20dp" android:text="원하는 과일을 선택하세요"/>
<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null" android:dividerHeight="10dp" android:id="@+id/listview_alterdialog_list"/>
</LinearLayout> </android.support.v7.widget.CardView> |
3. CardView를 사용하려면 build.gradle 파일에 com.android.support:cardview-v7를 추가해야 합니다.
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:cardview-v7:28.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } |
4. alert_dialog_row.xml
리스트뷰의 아이템으로 사용할 레이아웃입니다. 이미지뷰와 텍스트뷰로 구성됩니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:gravity="center" android:layout_margin="20dp" android:layout_width="match_parent" android:layout_height="wrap_content">
<ImageView android:id="@+id/alertDialogItemImageView" android:layout_width="32dp" android:layout_height="32dp" />
<TextView android:id="@+id/alertDialogItemTextView" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</LinearLayout> |
5. MainActivity.java
버튼을 클릭시 다이얼로그를 보여줍니다. 다이얼로그에 있는 아이템을 클릭시 텍스트뷰에 해당 아이템을 표시하도록 구현되어 있습니다.
package com.tistory.webnautes.custom_layout_alertdialog;
import android.content.DialogInterface; import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView;
import org.w3c.dom.Text;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
public class MainActivity extends AppCompatActivity {
private static final String TAG_TEXT = "text"; private static final String TAG_IMAGE = "image";
TextView textview_result;
List<Map<String, Object>> dialogItemList;
int[] image = {R.drawable.ic_001_grape, R.drawable.ic_002_cherry, R.drawable.ic_003_watermelon}; String[] text = {"포도", "체리", "수박"};
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
textview_result = (TextView)findViewById(R.id.textview_main_text);
Button button_run = (Button)findViewById(R.id.button_main_run); button_run.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {
showAlertDialog(); } });
dialogItemList = new ArrayList<>();
for(int i=0;i<image.length;i++) { Map<String, Object> itemMap = new HashMap<>(); itemMap.put(TAG_IMAGE, image[i]); itemMap.put(TAG_TEXT, text[i]);
dialogItemList.add(itemMap); } }
private void showAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(R.layout.alert_dialog, null); builder.setView(view);
final ListView listview = (ListView)view.findViewById(R.id.listview_alterdialog_list); final AlertDialog dialog = builder.create();
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, dialogItemList, R.layout.alert_dialog_row, new String[]{TAG_IMAGE, TAG_TEXT}, new int[]{R.id.alertDialogItemImageView, R.id.alertDialogItemTextView});
listview.setAdapter(simpleAdapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
textview_result.setText(text[position] + "를(을) 선택했습니다."); dialog.dismiss(); } });
dialog.setCancelable(false); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); dialog.show(); } }
|
참고
https://www.dev2qa.com/android-custom-layout-alertdialog-example/
최초작성 2019. 3. 6