반응형
반응형

#안드로이드 액티비티간의 데이터 전달 (intent 사용법) - 2


  • 인텐트를 통해서 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 정확히 아는 경우에는 '명시적인 인텐트(Explicit Intent)'
  • 액션과 데이터를 지정 하긴 했지만 호출할 대상이 달라질 수 있는 경우에는 '암시적인 인텐트(Implicit Intent)'

* 명시적인 인텐트와 암시적인 인텐트의 예시

전화번호 다이얼로 액티비티 띄우기(Action), 특정 A라는 액티비티로 데이터 전달을 할 경우 등등은 명시적인 인텐트라고 하며 암시적인 인텐트는 어떠한 걸 띄우기 잘 모를때 사용하는 것으로 만약 pdf나 문서 편집 어플을 통해서 보여줘야할 경우, 암시적인 인텐트를 통해서 휴대폰 단말기에 설치된 앱들 중에서 적절한 어플을 실행 시킬 수 있다.



반응형
반응형

#안드로이드 스튜디오 프로젝트 구조 : https://developer.android.com/studio/intro/index.html#_1




기본 프로젝트 구성

  1. 안드로이드 프로젝트명
  2. 프로젝트에 대한 설정이 가능한 conf 파일
  3. 안드로이드 프로젝트에 대한 실제 소스 구현하는 부분
  4. Resource 폴더로 프로젝트에서 사용할 이미지, 레이아웃 등을 담는 곳
    1. layout밑에 하위 폴더를 쓸 수 없는가?
      • 시도했다가 프로젝트 새로 빌드함. 할 순 있는 것 같은데 꼼수 같고 네이밍을 기똥차게 하는 수 밖에...
  5. 안드로이드 스튜디오 컴파일을 하기 위한 cradle 

일단, 이 곳에 정리를 해두고 나중에 새롭게 게시물 만들어서 링크를 걸자!




* lib download


Tool > Android > SDK Manager


반응형
반응형

안드로이드 스튜디오에서 SVN 사용하기


* 안드로이드 스튜디오 신규 프로젝트 생성 (Create new android studio project)
  1. File > New > New project
  2. Application name 지정 > Next
  3. Select the from factors your app will run on > Phone and tablet > IceCreamSandwich 4.0 > Next
  4. Activity 종류 선택 > Empty Activity > Next
  5. Activity Name 지정 > Finish
  6. 새로운 프로젝트 생성 중....
  7. 신규 프로젝트 생성 완료
* 안드로이드 스튜디오 SVN 초기 설정 (SVN 연결)
  1. https://www.visualsvn.com/downloads/ 에서 Apache Subversion command line tools 다운로드 
  2. 안드로이드 스튜디오 실행
  3. File > Settings > Subversion > General > Use command line client에서 svn.exe 파일로 경로 지정 > 저장
  4. 완료
* SVN 체크아웃 (Check-Out)
  1. File > New > Project form version Control > Subversion 선택
  2. Repositories + > Repository URL 입력 > OK 
  3. 해당 SVN 링크 옆에 ▶ 클릭 > 로딩 > SVN 계정 정보 입력 > 성공
  4. check-out 받을 프로젝트 폴더 위에서 > 마우스 오른쪽 > Check-out
  5. Destination Directory > 해당 프로젝트를 check-out 받을 경로 지정
  6. SVN Checkout Options > android-project path\trunk or 상위로 설정 > OK 
  7. Android Subversion working Format 1.8 기본 포맷 선택 후, 확인
  8. 완료
project check-out 후, 기존 gradle로 설정시
  1. Import Project > Import project from external model > Gradle 선택 > Next 
  2. Gradle Home setting > Use local gradle distribution > Finish
    1. gradle home path : android-studio\plugins\gradle
    2. 안드로이드 스튜디오 설치 파일에 함께 내장되어 있음
  3. 완료
project check-out 후, 새로운 프로젝트 생성시 
  1. create project from exstring sources > Next
  2. Project name과 Project location 확인 후 > Next 
  3. 계속 Next > Finish
  4. 'Schdule for Addtion, Do you want to schedule the following file for addtion to subverison?' .... '
  5. No - 
* SVN 커밋 (Commit)
  1. VCS > Commit Changes...
  2. Commit할 폴더 위에서 마우스 오른쪽 > Subversion > Commit DIrectory 
* SVN Sync 맞추기
  1. VCS > Update Poroject...
* 신규 또는 기존 프로젝트를 SVN에 Import하기
  1. SVN에 Import할 프로젝트 준비
  2. VCS > Import into Version Control > Import into Subversion
  3. Import할 Repositories 선택 > trunk > Import
  4. Import할 Project의 경로 지정 > OK
  5. Commit 메시지 설정 > OK
  6. SVN 버전 설정 > OK
  7. 완료
※ 안드로이드 스튜디오에서 SVN을 사용할 수는 있지만, 이클립스에서 사용하던 프로젝트를 안드로이드 스튜디오에서는 구동시킬 수 없다. 기존 프로젝트엔 gradle도 없고, 프로젝트 셋팅이 다르기 때문에 새롭게 해주어야 한다.

Import Error 

Cannot checkout from svn: svn E155000: '경로' is already a working copy for diffent URL.



관련 게시물

참고 링크


반응형
반응형

#리스트뷰 내에서 아이템 정렬하는 방법

// 데이터 정렬을 위한 Comparator

public static Comparator<AssemBean> cmpAsc = new Comparator<AssemBean>() {

        @Override

        public int compare(AssemBean o1, AssemBean o2) {

            return o1.getEmpNm().compareTo(o2.getEmpNm()) ;

        }

};



    /**

     * 대상 배열을 재정렬해줍니다.

     * @param targetArray -- 정렬할 배열

     */

    public void orderByAssemList(ArrayList<AssemBean> targetArray){

        // 전체 정렬

        Collections.sort(targetArray, cmpAsc);

        // Adapter에 전달

        adapter.addItem(targetArray);

    }



반응형
반응형

TextEdit은 자동 포커스를 가진다. 

해제하는 방법은 linearLayout에 focusable, focusableInTouchMode를 추가한다. 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true" android:focusableInTouchMode="true">


반응형
반응형

#안드로이드에서 로딩화면 구현하기

    • 방법1)LoadingActivity → MainActivity
    • 방법2)MainActivity → LoadingActivity → MainActivity


방법1) LoadingActivity → MainActivity

1) LoadingActivity 생성 

package com.example.n3815.new_app;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.os.Handler;

import com.example.n3815.new_app.assembly.AssemblyListActivity;


/**

 * Created by N3815 on 2017-01-31.

 */

public class LoadingActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_loading);

        startLoading();

    }

    /**

     * 로딩을 위한 메소드 구현 - 2초후에 이동

     */

    private void startLoading() {

        Handler handler = new Handler();

        handler.postDelayed(new Runnable() {

            @Override

            public void run() {

                Intent intent = new Intent(getBaseContext(), AssemblyListActivity.class);

                startActivity(intent);

                finish();

            }

        }, 2000);

    }

}


run() 부분에 시작할 Activity 설정


또는 

/**
 * Created by N3815 on 2017-01-31.
 */
public class LoadingActivity extends Activity {
    ArrayList<AssemBean> assemblyList = new ArrayList<AssemBean>(); // 전체 국회의원의 정보를 담는 객체
    // API 호출을 위한 Client
    DefaultRestClient<AssemblyService> restClient;
    // 국회의원 REST API URL SERVICE
    AssemblyService assemblyService;
    boolean isCall = false; // 호출이 되었는지 확인
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loading);
        try {
            if(!isCall) {
                // 전체 국회의원 리스트 가져오기
                AssemblyList();
            }
        } catch (IOException e) {
            // 다시 요청시도 하기
            Toast.makeText(LoadingActivity.this ,"[Loading] Error(10003-요청 오류)",Toast.LENGTH_LONG).show();            
  e.printStackTrace();
        }
}
    /**
     * 국회의원 목록 가져오기 I/F
     */
    public void AssemblyList() throws IOException {
        isCall = true;
        restClient = new DefaultRestClient<>();
        assemblyService = restClient.getAssemblyClient(AssemblyService.class);
        Call<Items> call = assemblyService.getMemberCurrStateList(1, 300);
        call.enqueue(new Callback<Items>() {
            @Override
            public void onResponse(Call<Items> call, Response<Items> response) {
                try{
                    if(response.isSuccessful()){
                        // 전체 대상자 추가하기
                        for(AssemBean userInfo : response.body().getItems()){
                            // 초성정보 객체에 미리 넣어주기
userInfo.setInitialEmpNm(SearchCommon.getInitialSound(userInfo.getEmpNm().charAt(0)));
assemblyList.add(userInfo);
 }
 Log.v("[AssemblyListActivity]","[API 호출 성공]: "+assemblyList.size()); 
 Log.v("[AssemblyListActivity]","[Adapter에 전달]: 모든 국회의원 정보를 조회 완료하였습니다.");

 if(assemblyList.size() == 300){
        Intent intent = new Intent(LoadingActivity.this, AssemblyListActivity.class)
        intent.putExtra("assem", assemblyList);
        startActivity(intent);    
 }
                    }
}catch (Exception e){
                    Toast.makeText(LoadingActivity.this ,"[Loading] Error(10000-파싱 오류)",Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }
}
            @Override
            public void onFailure(Call<Items> call, Throwable throwable) {
                if(throwable instanceof SocketTimeoutException){
                    // 다시 요청시도 하기
                    Toast.makeText(LoadingActivity.this ,"서버가 불안정합니다. 다시 시도해주세요.",Toast.LENGTH_LONG).show();
                }else{
                    // 다시 요청시도 하기
                    Toast.makeText(LoadingActivity.this ,"[Loading] Error(10001-요청 오류)",Toast.LENGTH_LONG).show();
                }
                throwable.printStackTrace();
            }
        });
    }

주의할 것! finish()가 없을 경우, 뒤로가기 버튼 클릭시 로딩화면으로 다시 되돌아간다.


2) android Manifest.xml 파일에 시작 Activity 수정

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.n3815.new_app">

    <uses-permission android:name="android.permission.INTERNET"/>

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application

        android:name="android.support.multidex.MultiDexApplication"

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:supportsRtl="true"

        android:theme="@style/Theme.AppCompat.Light.NoActionBar">

        <activity android:name=".LoadingActivity" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <activity android:name = ".SubActivity"/>

        <activity android:name = ".MainActivity"/>

        <activity android:name = ".list.ListActivity"/>

        <activity android:name = ".customList.CustomListActivity"/>

        <activity android:name = ".assembly.AssemblyListActivity"/>

        <activity android:name = ".assembly.AssemblyDetailActivity"/>

        <activity android:name = ".assembly.AssemblySearchActivity"/>

    </application>

</manifest>


시작 Activity를 LoadingActivity로 변경


방법2) MainActivity → LoadingActivity → MainActivity

나중에 정리하자.



참고 링크


반응형
반응형

http://linuxism.tistory.com/1451



반응형
반응형
package com.example.n3815.new_app.assembly;

import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.n3815.new_app.R;
import com.example.n3815.new_app.common.bean.AssemBean;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;

/**
* Created by N3815 on 2016-12-28.
*/

public class AssemblyListAdapter extends BaseAdapter {
// Adapter에 추가된 데이터를 저장하기 위한 ArrayList
private ArrayList<AssemBean> assemblyItemList = new ArrayList<AssemBean>();

ArrayList<AssemBean> temp = new ArrayList<AssemBean>();

public AssemblyListAdapter(){
}

// Adapter에 사용되는 데이터의 개수를 리턴. : 필수 구현
@Override
public int getCount() {
return assemblyItemList.size() ;
}

// 지정한 위치(position)에 있는 데이터와 관계된 아이템(row)의 ID를 리턴. : 필수 구현
@Override
public long getItemId(int position) {
return position ;
}

// 지정한 위치(position)에 있는 데이터 리턴 : 필수 구현
@Override
public Object getItem(int position) {
return assemblyItemList.get(position) ;
}

// 데이터 정렬을 위한 Comparator
public static Comparator<AssemBean> cmpAsc = new Comparator<AssemBean>() {
@Override
public int compare(AssemBean o1, AssemBean o2) {
return o1.getEmpNm().compareTo(o2.getEmpNm()) ;
}
};

/**
* 어뎁터의 뷰를 구현하는 함수
* @param position -- 행의 index를 의미
* @param convertView -- 행 전체를 나타내는 뷰를 의미
* @param parent -- 어댑터를 가지고 있는 부모의 뷰를 의미
* @return
*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {

final Context context = parent.getContext();
ViewHolder viewHolder;
View v = convertView;

// getView에서 넘어오는 convertView는 이전에 그려졌던 view를 넘기는데요.
// 한번도 inflate되지 않은 view라면 null로 전달되는 경우가 있으니 반드시 null체크는 해야합니다.
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.activity_assem_item, parent, false);

// 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 데이터 획득
viewHolder = new ViewHolder();
viewHolder.imgView = (ImageView) v.findViewById(R.id.assem_empImg);
viewHolder.empNmView = (TextView) v.findViewById(R.id.assem_empNm);
viewHolder.origNmView = (TextView) v.findViewById(R.id.assem_origNm);
viewHolder.favoriteBtn = (CheckBox) v.findViewById(R.id.favorite);
viewHolder.colorView = (TextView) v.findViewById(R.id.color);
v.setTag(viewHolder);

// 즐겨찾기 버튼 클릭시
viewHolder.favoriteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// [callback] 현재 선택된 객체 정보를 가져온다.
AssemBean selectedAssem = (AssemBean) view.getTag();
CheckBox selectedBtn = (CheckBox) view;

// 아이템을 클릭했을 경우,
if (selectedAssem.getFavorite() == false && selectedBtn.isChecked()){
Log.v("★[추가]★","======>>"+selectedAssem.getEmpNm());

// 객체의 정보를 true로 설정 - 자동으로 Array 배열의 값이 변경
selectedAssem.setFavorite(true);

for(AssemBean u : assemblyItemList){
Log.v("*[전체]*",":"+u.getEmpNm()+",("+u.getFavorite()+")");
}

// 현재 객체의 정보를 저장
view.setTag(selectedAssem);


temp.clear();
for(int q=0; q < assemblyItemList.size(); q++){
// assemblyItemList에 담긴 값이 즐겨찾기가 true일 경우
if(assemblyItemList.get(q).getFavorite()){
Log.v("*[temp에 add]*","======>>"+assemblyItemList.get(q).getEmpNm()+"("+q+")");
temp.add(assemblyItemList.get(q)); // 해당 객체 insert
assemblyItemList.remove(assemblyItemList.get(q)); // 해당 객체 delete
}else{
Log.v("*[X그외X]*","==>>"+assemblyItemList.get(q).getEmpNm()+"("+q+")");
}
}
// temp에 담긴 즐겨찾기 리스트 재정렬
Collections.sort(temp, cmpAsc);
for(AssemBean u : temp){
Log.v("#[즐겨찾기 정렬 중]#",":"+u.getEmpNm()+",("+u.getFavorite()+")");
}

// 맨 앞으로 이동
assemblyItemList.addAll(0, temp);
Log.v("===========","======================================>>>>>>"+assemblyItemList.size());
// assemblyItemList를 모두 찍어보기
for(AssemBean u : assemblyItemList){
Log.v("#[결과]#",":"+u.getEmpNm()+",("+u.getFavorite()+")");
}

notifyDataSetChanged();
Toast.makeText(context,"즐겨찾기가 등록 되었습니다.",Toast.LENGTH_LONG).show();

}else if(selectedAssem.getFavorite() == true){
Log.v("★[해제]★","======>>"+selectedAssem.getEmpNm());

selectedAssem.setFavorite(false);

// assemblyItemList를 모두 찍어보기
for(AssemBean u : assemblyItemList){
Log.v("*[전체]*",":"+u.getEmpNm()+",("+u.getFavorite()+")");
}
Log.v("*[전체 총개수]*",":("+assemblyItemList.size()+")");

temp.clear();

Collections.sort(assemblyItemList, cmpAsc);
for(int q=0; q < temp.size(); q++){
// 해당 정보가 false일 경우
if(assemblyItemList.get(q).getFavorite() && selectedAssem.getFavorite()){
Log.v("*[temp에 add]*","======>>"+assemblyItemList.get(q).getEmpNm());
temp.add(assemblyItemList.get(q));
assemblyItemList.remove(assemblyItemList.get(q));
}
}

// temp에 담긴 즐겨찾기 리스트 재정렬
Collections.sort(temp, cmpAsc);

// 맨 앞으로 이동
assemblyItemList.addAll(0, temp);

// assemblyItemList를 모두 찍어보기
for(AssemBean u : assemblyItemList){
Log.v("#[즐겨찾기 정렬 중]#",":"+u.getEmpNm()+",("+u.getFavorite()+")");
}

notifyDataSetChanged();
Toast.makeText(context,"즐겨찾기가 해제 되었습니다.",Toast.LENGTH_LONG).show();
}
}
});
}
// 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용한다
else{
viewHolder = (ViewHolder) v.getTag();
}

// Data Set(assemblyItemList)에서 position에 위치한 데이터 획득
final AssemBean listViewItem = assemblyItemList.get(position);
if(listViewItem != null){
// 현재 클릭한 아이템이 해당 객체에 들어가게된다.
viewHolder.favoriteBtn.setTag(listViewItem);

// 정당 색깔 구분
viewHolder.colorView.setBackgroundColor(Color.rgb(128, 128, 128));
if(listViewItem.getEmpNm().contains("강")) {
viewHolder.colorView.setBackgroundColor(Color.rgb(255, 0, 0));
}

// 각 위젯에 데이터 반영
Picasso.with(context).load(listViewItem.getJpgLink()).into(viewHolder.imgView);
viewHolder.empNmView.setText(listViewItem.getEmpNm());
viewHolder.origNmView.setText(listViewItem.getOrigNm());
viewHolder.favoriteBtn.setChecked(listViewItem.getFavorite());
}

return v;
}

/**
* 검색 기능
* @param charText -- 검색어
* @param assemList -- 국회의원 리스트
*/
public ArrayList<AssemBean> filter(String charText, ArrayList<AssemBean> assemList) {
charText = charText.toLowerCase(Locale.getDefault());
assemblyItemList.clear(); // 어뎁터 뷰에 연결된 배열 초기화

Log.v("***","전체 대상자 :"+assemList.size()+", (검색어 :"+charText+")***");

if (charText.length() == 0) {
// 검색된 글자가 하나도 없을 경우, 전체 리스트를 넣어주기
assemblyItemList.addAll(assemList);
} else {
// 검색된 글자가 있을 경우, 검색어와 일치하는 국회의원 정보를 담아주기
for(AssemBean u : assemList){
String name = u.getEmpNm(); // 국회의원 이름
if (name.toLowerCase().contains(charText)) {
Log.v("*[확인]*","일치하는 국회의원 :"+name);
assemblyItemList.add(u);
}
}
}

return orderByAssemList(assemblyItemList);
}

/**
* 대상 배열을 재정렬해줍니다.
* @param targetArray
*/
public ArrayList<AssemBean> orderByAssemList(ArrayList<AssemBean> targetArray){

// 전체정렬
Collections.sort(targetArray, cmpAsc);
Log.v("===========","========================================");

// 즐겨찾기 골라서 맨위로
ArrayList<AssemBean> temp = new ArrayList<AssemBean>();
for(int j = 0; j < targetArray.size(); j++){
if(targetArray.get(j).getFavorite() == true){
temp.add(targetArray.get(j));
targetArray.remove(j);
}
}
Collections.sort(temp, cmpAsc);
targetArray.addAll(0, temp);

notifyDataSetChanged();

return targetArray;
}

public class ViewHolder
{
public int number;
ImageView imgView;
TextView empNmView;
TextView origNmView;
CheckBox favoriteBtn;
TextView colorView;
}

}


반응형

+ Recent posts