안드로이드 개발 질문/답변
(글 수 45,052)
그림과 같이 글씨가 잘리네요 ㅠㅠ
뭐 어떻게해도 크기를 조정할수없으니...
결국 CustomAdapter쓰는게 답인건가요..
안드로메다거 쓰면서 ListView에 글자 크기만큼 동적으로 늘어나라고 지정하는건 무리일가요 ?ㅠㅠ
이게 PresetSMSActivity 고요.
import java.util.ArrayList;
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; import android.text.InputFilter; import android.util.Log; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast;
public class PresetSMSActivity extends Activity {
private static final String TEXT_ENTRY_KEY = "TEXT_ENTRY_KEY";
private static final String ADDING_ITEM_KEY = "ADDING_ITEM_KEY";
private static final String SELECTED_INDEX_KEY = "SELECTED_INDEX_KEY";
public static final String SMS_SAVE_TEXT1 = "SMS_SAVE_TEXT1";
public static final String SMS_SAVE_TEXT2 = "SMS_SAVE_TEXT2";
public static final String SMS_SAVE_TEXT3 = "SMS_SAVE_TEXT3";
public static final String SMS_SAVE_TEXT4 = "SMS_SAVE_TEXT4";
public static final String SMS_SAVE_TEXT5 = "SMS_SAVE_TEXT5";
public static final String CHOICE_SEL = "CHOICE_SEL";private static final int REMOVE_TODO = Menu.FIRST + 1; private static final int CANCEL_REMOVE = Menu.FIRST + 2; private boolean addingNew = false; private static int cnt = 0; public static int choice_sel = 0; public ArrayList<String> items; ArrayAdapter<String> adapter; ListView MyListView; EditText MyEditText; Button bt; private int maxByte = 80;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preset_message); items = new ArrayList<String>();
int resID = android.R.layout.simple_list_item_single_choice;
//int resID = R.layout.preset_message;
adapter = new ArrayAdapter<String>(this, resID, items);
bt = (Button)findViewById(R.id.addBt);
MyEditText = (EditText)findViewById(R.id.myEditText);
MyListView = (ListView)findViewById(R.id.preset_List);
InputFilter[] filters = new InputFilter[]{new ByteLengthFilter(maxByte, "euc-kr")};
MyEditText.setFilters(filters);
// listView의 항목을 선택하려면 체크박스나 라디오 버튼이 있어야 하므로 아래의 레이아웃을 선택했다.
MyListView.setAdapter(adapter);
// 위 Adapter의 레이아웃이 single이기 때문에 listview의 선택모드도 CHOICE_MODE_SINGLE이여야 한다.
MyListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); // 하나의 항목만 선택 가능
if(cnt == 0){
SharedPreferences uiState = getPreferences(0);
SharedPreferences.Editor editor = uiState.edit();
editor.putString(SMS_SAVE_TEXT1, "지금은 연락을 받을수 없습니다. 나중에 다시 확인후 연락하겠습니다.");
editor.putInt(CHOICE_SEL, 0);
editor.commit();
cnt++;
} registerForContextMenu(MyListView);
restoreUIState();
bt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(MyEditText.getVisibility() == View.GONE){
if(cnt == 5){
AlertDialog_SMS();
}
else{
MyEditText.setVisibility(View.VISIBLE);
}
}
else{
addingNew = true;
String newItem = MyEditText.getText().toString();
if(newItem.toString().replaceAll(" ", "").replaceAll("\n", "") == ""){
AlertDialog_SMS();
}else{
items.add(0, newItem);
MyEditText.setText("");
adapter.notifyDataSetChanged();
cancelAdd();
MyEditText.setVisibility(View.GONE);
cnt++;
Toast.makeText(getApplicationContext(), "등록 완료!", Toast.LENGTH_SHORT).show();
addingNew = false;
Log.i("cnt count = ", ""+cnt);
MyListView.setItemChecked(0, true);
}
}
}
});
}
public void AlertDialog_SMS(){
if(addingNew){
new AlertDialog.Builder(this).setTitle("오류!")
.setMessage("텍스트를 입력해주세요!!!")
.setNeutralButton("확인", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}).show();
}else{
new AlertDialog.Builder(this).setTitle("오류!")
.setMessage("최대 5개까지만 입력 가능합니다!!!")
.setNeutralButton("확인", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}).show();
}
}
private void restoreUIState() {
Log.i("restoreUIState()", "Start");
// 액티비티 환경설정 객체를 얻어온다.
SharedPreferences settings = getPreferences(Activity.MODE_WORLD_READABLE); // UI 상태 값들을 읽어온다.
// 기본 값으로 쓰일 값들도 지정한다.
String text = settings.getString(TEXT_ENTRY_KEY, "");
Boolean adding = settings.getBoolean(ADDING_ITEM_KEY, false);
int count = settings.getInt(null, cnt);
setResult(count);
Log.i("cnt값", ""+cnt); // UI를 이전 상태로 복구한다.
if (adding) {
addNewItem();
MyEditText.setText(text);
}
String ListText;
if(cnt >= 1){
for(int i = cnt-1 ; i >= 0 ; i --){
if(i == 0){
ListText = settings.getString(SMS_SAVE_TEXT1, "");
String newItem = ListText;
items.add(0, newItem);
adapter.notifyDataSetChanged();
Log.i("i", ""+i);
Log.i("SMS_SAVE_TEXT1", ListText);
}else if(i == 1){
ListText = settings.getString(SMS_SAVE_TEXT2, "");
String newItem = ListText;
items.add(0, newItem);
adapter.notifyDataSetChanged();
Log.i("i", ""+i);
Log.i("SMS_SAVE_TEXT2", ListText);
}else if(i == 2){
ListText = settings.getString(SMS_SAVE_TEXT3, "");
String newItem = ListText;
items.add(0, newItem);
adapter.notifyDataSetChanged();
Log.i("i", ""+i);
Log.i("SMS_SAVE_TEXT3", ListText);
}else if(i == 3){
ListText = settings.getString(SMS_SAVE_TEXT4, "");
String newItem = ListText;
items.add(0, newItem);
adapter.notifyDataSetChanged();
Log.i("i", ""+i);
Log.i("SMS_SAVE_TEXT4", ListText);
}else if(i == 4){
ListText = settings.getString(SMS_SAVE_TEXT5, "");
String newItem = ListText;
items.add(0, newItem);
adapter.notifyDataSetChanged();
Log.i("i", ""+i);
Log.i("SMS_SAVE_TEXT5", ListText);
}
}
}
choice_sel = settings.getInt(CHOICE_SEL, 0);
MyListView.setItemChecked(choice_sel, true);
} @Override
protected void onPause(){
super.onPause();// 액티비티 환경설정 객체를 얻어온다. SharedPreferences uiState = getPreferences(0);
// 환경설정 에디터를 얻어온다. SharedPreferences.Editor editor = uiState.edit();
// UI 상태 환경설정 값들을 추가한다.
editor.putString(TEXT_ENTRY_KEY, MyEditText.getText().toString());
editor.putBoolean(ADDING_ITEM_KEY, addingNew);
choice_sel = MyListView.getCheckedItemPosition();
editor.putInt(CHOICE_SEL, choice_sel);
editor.putInt("cnt", cnt);
Log.i("cnt값", ""+cnt);
for(int i = 0 ; i < cnt ; i ++){
String tmp = (String)items.get(i).toString();
if(i == 0){
editor.putString(SMS_SAVE_TEXT1,tmp);
Log.i("SMS_SAVE_TEXT1",tmp);
}else if(i == 1){
editor.putString(SMS_SAVE_TEXT2,tmp);
Log.i("SMS_SAVE_TEXT2",tmp);
}else if(i == 2){
editor.putString(SMS_SAVE_TEXT3,tmp);
Log.i("SMS_SAVE_TEXT3",tmp);
}else if(i == 3){
editor.putString(SMS_SAVE_TEXT4,tmp);
Log.i("SMS_SAVE_TEXT4",tmp);
}else if(i == 4){
editor.putString(SMS_SAVE_TEXT5,tmp);
Log.i("SMS_SAVE_TEXT5",tmp);
}
}
Log.i("cnt", ""+cnt);
// 변경된 내용을 적용한다.
editor.commit();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(SELECTED_INDEX_KEY, MyListView.getSelectedItemPosition());
super.onSaveInstanceState(savedInstanceState);
} @Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
int pos = -1; if (savedInstanceState != null)
if (savedInstanceState.containsKey(SELECTED_INDEX_KEY))
pos = savedInstanceState.getInt(SELECTED_INDEX_KEY, -1);MyListView.setSelection(pos); }
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); if(cnt < 2){
Toast.makeText(getApplicationContext(), "최소 1개이상의 SMS 내용이 추가되어있어야 합니다.", Toast.LENGTH_SHORT).show();
}else{
menu.setHeaderTitle("삭제 확인");
menu.add(0, REMOVE_TODO, Menu.NONE, "삭제");
menu.add(1, CANCEL_REMOVE, Menu.NONE, "취소");
}
} @Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item); switch (item.getItemId()) {
case (REMOVE_TODO): {
AdapterView.AdapterContextMenuInfo menuInfo;
menuInfo =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
int index = menuInfo.position; removeItem(index);
cnt--;
Log.i("cnt count = ", ""+cnt);
return true;
}
}
return false;
} private void cancelAdd() {
addingNew = false;
MyEditText.setVisibility(View.GONE);
} private void addNewItem() {
addingNew = true;
MyEditText.setVisibility(View.VISIBLE);
MyEditText.requestFocus();
} private void removeItem(int _index) {
items.remove(_index);
adapter.notifyDataSetChanged();
if(choice_sel <= MyListView.getChildCount()){
MyListView.setItemChecked(choice_sel, true);
}else{
MyListView.setItemChecked(0, true);
}
}
}이게 preset_message.xml 입니다.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <EditText android:id="@+id/myEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:visibility="gone"> </EditText> <ListView android:id="@+id/preset_List" android:choiceMode="singleChoice" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_above="@+id/addBt" android:layout_below="@+id/myEditText"> </ListView> <Button android:id="@+id/addBt" android:layout_alignParentBottom="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="안내 SMS 내용 추가" android:gravity="center"> </Button> </RelativeLayout>




android.R.layout.simple_list_item_single_choice 레이아웃의 높이가 고정이 되어있어서
화면에서 짤리는거입니다
커스텀어뎁터를 하시 싫으시면 그냥 약간 꼼수로 저 레이아웃 그대로 긁어다가
높이값만 수정해서 ArrayAdater에 넘겨주세요. 그럼 제대로 보이네요.
p.s 100dip 정도 주니 잘보이더군요~