안드로이드 개발 질문/답변
(글 수 45,052)
API Demo에 있는 ExpandableList1예제를 참고해 만들었는데, 계속 indicator와 간격이 이상하네요.
혹시나 소스에 문제가 있나해서 API demo소스를 그대로 copy&paste해서 돌려보았더니 그래도 이상하네요.
indicator 이미지를 리소스로 저장하는것과 selector 지정하는 것도 동일하게 해줬는데, 다음과 같은 차이가 나는 이유를 모르겠네요.
왼쪽이 제가 따로 프로젝트를 만들어서 돌린것이고, 오른쪽이 API demo 창입니다.
리소스도 동일하고 소스도 동일한데, 왜 이런 차이가 나는지 모르겠네요.
혹시나 모르니 제가 따로 프로젝트 만든거 소스를 첨부할께요
package org.jjh.project;
import android.app.ExpandableListActivity;
import android.content.Intent;
import android.graphics.drawable.StateListDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.util.Log;
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.app.ExpandableListActivity;
import android.graphics.drawable.StateListDrawable;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
/**
* Demonstrates expandable lists using a custom {@link ExpandableListAdapter}
* from {@link BaseExpandableListAdapter}.
*/
public class ExpandableListMenu extends ExpandableListActivity {
ExpandableListAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set up our adapter
mAdapter = new MyExpandableListAdapter();
setListAdapter(mAdapter);
registerForContextMenu(getExpandableListView());
StateListDrawable groupIndicator = (StateListDrawable)getResources().getDrawable(R.drawable.group_indicator_01);
getExpandableListView().setGroupIndicator(groupIndicator);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Sample menu");
menu.add(0, 0, 0, R.string.expandable_list_sample_action);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();
String title = ((TextView) info.targetView).getText().toString();
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos,
Toast.LENGTH_SHORT).show();
return true;
} else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
/**
* A simple adapter which maintains an ArrayList of photo resource Ids.
* Each photo is displayed as an image. This adapter supports clearing the
* list of photos and adding a new photo.
*
*/
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
// Sample data set. children[i] contains the children (String[]) for groups[i].
private String[] groups = { "사람이름", "Dog Names", "Cat Names", "Fish Names" };
private String[][] children = {
{ "Arnold", "Barry", "Chuck", "David" },
{ "Ace", "Bandit", "Cha-Cha", "Deuce" },
{ "Fluffy", "Snuggles" },
{ }
};
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition];
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getChildrenCount(int groupPosition) {
return children[groupPosition].length;
}
public TextView getGenericView() {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 64);
TextView textView = new TextView(ExpandableListMenu.this);
textView.setLayoutParams(lp);
// Center the text vertically
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
textView.setPadding(36, 0, 0, 0);
return textView;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getChild(groupPosition, childPosition).toString());
return textView;
}
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
public int getGroupCount() {
return groups.length;
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getGroup(groupPosition).toString());
if(getChildrenCount(groupPosition) == 0){
getExpandableListView().expandGroup(groupPosition);
}
return textView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public boolean hasStableIds() {
return true;
}
}
}
2010.10.19 17:10:24
제가 잘못 알고 있는건가요?
위의 예제는 따로 layout.xml파일을 이용하고 있지 않은것 같은데요.
selector지정한 xml 파일은 다음과 같습니다. 물론 이건 API demo와 동일하구요
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_expanded="true" android:state_empty="true"
android:drawable="@drawable/blank"/>
<item
android:state_expanded="true"
android:drawable="@drawable/expander_ic_maximized" />
<item
android:drawable="@drawable/expander_ic_minimized" />
</selector>
2010.10.19 18:25:49
APIdemo의 ExpandableListView가 parent의 설정을 받아오는것 같은데 어디서 그걸 바꾸는지 모르겠네요.
저기위에 FILL_PARENT때문에 parent의 사이즈에 따라 list의 모양에도 영향을 끼치는것 같은데,
그걸 세팅해주면 API_demo와 동일하게 출력이 될것 같다는 생각이 갑자기 드네요. ㅠㅠ
2010.10.19 19:53:30
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 64);
textView.setPadding(36, 0, 0, 0);
에서
64랑 36을 늘려주니까 API demo와 비슷하게 되네요. 근데, 왜 같은 수치값인데, 두 프로그램이 차이가 나는지 모르겠네요.
2010.10.19 22:30:37
디자이어 내부의 문제 같습니다. 같은 코드를 에뮬레이터로 돌려봤더니, 두경우가 차이가 없음 ㅠㅠ.
디자이어 쓰고 있는데 점점 폰이 안좋아 지는 느낌이 드네요. 2.2 업그레이드를 아직 안해서 그런가?
컴텨 포맷하듯이 한번 싹 뒤집어 업어야 겠음.