검색결과 리스트
Android에 해당되는 글 14건
- 2017.12.21 커스텀 리스트뷰 ( Custom ListView)
- 2017.12.21 Volley를 이용한 간단한 네트워크 통신
- 2017.12.21 런타임에 권한 요청
- 2013.11.13 Navigation Drawer 분석 1
Kotlin으로 작성된 커스텀 리스트뷰 예제
MainActivity.kt
import android.content.Context
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val list: ArrayList<CustomItem> = ArrayList()
list.add(CustomItem("James", 23, "Male"))
list.add(CustomItem("Jamie", 20, "Female"))
list.add(CustomItem("John", 30, "Male"))
listview1.adapter = CustomAdapter(this, list)
}
private class CustomAdapter(context: Context, array: ArrayList<CustomItem>): BaseAdapter() {
private var list: ArrayList<CustomItem> = array
private var inflater: LayoutInflater = LayoutInflater.from(context)
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
val view: View?
val viewHolder: ViewHolder
if(p1 == null) {
view = this.inflater.inflate(R.layout.listview_item, p2,false)
viewHolder = ViewHolder(view)
view.tag = viewHolder
}
else {
view = p1
viewHolder = view.tag as ViewHolder
}
viewHolder.name.text = list[p0].name
viewHolder.age.text = list[p0].age.toString()
viewHolder.gender.text = list[p0].gender
return view!!
}
override fun getItem(p0: Int): Any {
return list[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return list.size
}
}
private class ViewHolder(view: View?) {
val name: TextView = view?.findViewById(R.id.nameTextView) as TextView
val age: TextView = view?.findViewById(R.id.ageTextView) as TextView
val gender: TextView = view?.findViewById(R.id.genderTextView) as TextView
}
data class CustomItem(var name: String, var age: Int, var gender: String)
}
listview_item.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">
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
<TextView
android:id="@+id/ageTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
<TextView
android:id="@+id/genderTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
</LinearLayout>
Constraint Layout을 이용한 Floating action button Menu 만들기 (0) | 2018.01.09 |
---|---|
Volley를 이용한 간단한 네트워크 통신 (0) | 2017.12.21 |
Volley를 이용하여 간단한 HTTP 통신을 하는 예제이다.
1. AndroidManifest.xml 에서 권한 명시
<uses-permission android:name="android.permission.INTERNET" />
2. build.gradle 내 dependencies 에 Volley 사용을 위한 명시
compile 'com.android.volley:volley:1.1.0'
3. Build - Make Project 를 하여 프로젝트에서 Volley 사용 가능
4. HTTP 통신 예제
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log.i
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
lateinit var request: RequestQueue
lateinit var stringRequest: StringRequest
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Setup RequestQueue
request = Volley.newRequestQueue(this)
val url = "http://www.google.com"
// Setup StringRequest
stringRequest = StringRequest(Request.Method.GET, url, Response.Listener<String> {
response -> textView1.text = response // Print http source using textview
}, Response.ErrorListener {
error -> i(applicationContext.packageName, error.toString()) // Print log if error occurred
})
// Set tag for cancel
stringRequest.tag = applicationContext.packageName
// Request
request.add(stringRequest)
}
override fun onStop() {
super.onStop()
// Cancel all request that have packageName tag
if(request != null) {
request.cancelAll(applicationContext.packageName)
}
}
}
GitHub : https://github.com/Hot6ix/SimpleHttpRequest
출처 : https://developer.android.com/training/volley/simple.html
Constraint Layout을 이용한 Floating action button Menu 만들기 (0) | 2018.01.09 |
---|---|
커스텀 리스트뷰 ( Custom ListView) (0) | 2017.12.21 |
안드로이드 6.0 이후부터는 일부 권한의 경우 단순히 AndroidManifest.xml 에 명시하더라도 작동이 되지 않는다.
설치될 때 권한을 부여하는 것이 아니라 실행되는 도중 런타임에 권한을 요청하기 때문이다.
하지만 여전히 AndroidManifest.xml 에 권한을 명시해야 한다.
예제의 경우 주소록 읽기 권한을 요청한다.
권한 요청
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// 권한이 없으므로 요청
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS 의 경우 사용자 정의 값으로
// 응답 처리에 필요
}
응답 처리
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 권한 획득
} else {
// 권한 획득 실패
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
별도의 요청이 필요한 권한 목록
CALENDAR | |
CAMERA | |
CONTACTS | |
LOCATION | |
MICROPHONE | |
PHONE | |
SENSORS | |
SMS | |
STORAGE |
출처 : https://developer.android.com/training/permissions/requesting.html?hl=ko
Google Maps utility library 소개 (0) | 2018.01.15 |
---|---|
Google Map에 사용자지정 액티비티 전환 적용 방법 (0) | 2018.01.08 |
Navigation Drawer 분석 (1) | 2013.11.13 |
커스텀 리스트뷰에서 클릭시 클릭된 아이템 배경 색 설정 (1) | 2012.10.15 |
커스텀 리스트뷰 만들기 (0) | 2012.10.14 |
사진 1
Navigation Drawer(네비게이션 드로워)
안드로이드가 발전하고 있는 만큼 화면의 효율적인 활용이 중요시 되고 있다. ActionBar, Fragment 등을 이용하여 화면을 분할하고 각각에 역할을 줄 수 있게 되었다. Navigation Drawer도 화면을 효율적으로 사용할 수 있게 해주는 방법 중 하나이다. 대부분의 구글 앱에는 Navigation Drawer가 적용되어 있고, 인기 앱에도 자주 사용되고 있다.
소스 다운로드 및 소개 페이지
http://developer.android.com/intl/ko/training/implementing-navigation/nav-drawer.html 에서
오른쪽 중간 부분에 'Download the sample app'을 다운하면 된다.
또는
소스를 보면 메인 클래스 하나가 전부이다.
변수 정의
private DrawerLayout mDrawerLayout; // 주 기능 private ListView mDrawerList; // 내용 private ActionBarDrawerToggle mDrawerToggle; // 주 기능 private CharSequence mDrawerTitle; // ActionBar의 제목을 변경하기 위한 변수 private CharSequence mTitle; // ActionBar의 제목을 변경하기 위한 변수 private String[] mPlanetTitles; // 태양계 행성 이름들
onCreate()
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 액션바 제목 mTitle = mDrawerTitle = getTitle(); // strings.xml의 데이터 삽입 mPlanetTitles = getResources().getStringArray(R.array.planets_array); // DrawerLayout 정의 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); // DrawerLayout Shadow 정의(사진 2 참조) mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); // ListView 정의 mDrawerList = (ListView) findViewById(R.id.left_drawer); // ListView 데이터 정의 mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mPlanetTitles)); // ListView 아이템 클릭 리스너 mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); // ActionBar의 홈버튼을 Navigation Drawer 토글기능으로 사용 getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); // 토글 정의 mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close ) { public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); } }; // Drawer Layout의 리스너를 mDrawerToggle로 정의 mDrawerLayout.setDrawerListener(mDrawerToggle); // 인스턴스 상태가 존재 안하면 가장 첫번째 아이템으로 시작 if (savedInstanceState == null) { selectItem(0); } }
사진 2
DrawerItemClickListener() & selectItem()
private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position); } } private void selectItem(int position) { ⁄// 리스트 아이템 클릭 시 변경됨 Fragment fragment = new PlanetFragment(); // Fragment에 추가적인 정보 저장 Bundle args = new Bundle(); args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); fragment.setArguments(args); // FragmentManger가 Fragment가 바뀔때마다 교체해줌 FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); // 아이템이 계속 클릭된 상태로 유지 mDrawerList.setItemChecked(position, true); // ActionBar 제목 변경(해당 글에는 넣지 않음.) setTitle(mPlanetTitles[position]); // Drawer Layout 닫기 mDrawerLayout.closeDrawer(mDrawerList); }
PlanetFragment Class
public static class PlanetFragment extends Fragment { public static final String ARG_PLANET_NUMBER = "planet_number"; public PlanetFragment() { // Fragment 하위 클래스 때문에 필요함 } // 기본 Fragment의 화면 정의 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_planet, container, false); int i = getArguments().getInt(ARG_PLANET_NUMBER); String planet = getResources().getStringArray(R.array.planets_array)[i]; int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()), "drawable", getActivity().getPackageName()); ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId); getActivity().setTitle(planet); return rootView; } }
이 외에도 여러 메소드들이 존재하지만 이 글에는 최소한의 Drawer Layout 생성 및 작동에 필요한 메소드들과 클래스만 적어두었다.
activity_main.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http:⁄⁄schemas.android.com⁄apk⁄res⁄android" android:id="@+id⁄drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id⁄content_frame" android:layout_width="match_parent" android:layout_height="match_parent" ⁄> <ListView android:id="@+id⁄left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@android:color⁄transparent" android:dividerHeight="0dp" android:background="@android:color⁄white"⁄> <⁄android.support.v4.widget.DrawerLayout>
DrawerLayout에 FrameLayout과 ListView를 넣어 구현하였다.
FrameLayout말고 다른 Layout이 삽입되어도 된다.
drawer_list_item.xml
<TextView xmlns:android="http:⁄⁄schemas.android.com⁄apk⁄res⁄android" android:id="@android:id⁄text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr⁄textAppearanceListItemSmall" android:gravity="center_vertical" android:paddingLeft="16dp" android:paddingRight="16dp" android:textColor="@android:color⁄black" android:background="?android:attr⁄activatedBackgroundIndicator" android:minHeight="?android:attr⁄listPreferredItemHeightSmall"⁄>
각각의 리스트 아이템에 적용되는 속성이다.
fragment_planet.xml
<ImageView xmlns:android="http:⁄⁄schemas.android.com⁄apk⁄res⁄android" android:id="@+id⁄image" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000000" android:gravity="center" android:padding="32dp" ⁄>
각각의 Fragment의 이미지들의 대한 속성이다.
구글이 제공하는 소스에는 ListView를 이용한 Drawer Layout을 구현되어 있다. 하지만 이 ListView를 좀 더 커스텀하여 꾸밀 수도 있고, ListView가 아닌 Layout을 넣음으로써 텍스트뷰, 버튼, Radio 버튼, 체크박스, 레이아웃 종류 등 다양한 시도를 할 수 있다.
Google Map에 사용자지정 액티비티 전환 적용 방법 (0) | 2018.01.08 |
---|---|
런타임에 권한 요청 (0) | 2017.12.21 |
커스텀 리스트뷰에서 클릭시 클릭된 아이템 배경 색 설정 (1) | 2012.10.15 |
커스텀 리스트뷰 만들기 (0) | 2012.10.14 |
안드로이드 다중 replace 사용 (0) | 2012.10.10 |
RECENT COMMENT