'앱개발'에 해당되는 글 8건

Android에서 Action Bar를 이용하여 아래와 같은 탭 액티비티를 만들수 있다.

물론 이전에도 Tab Host등을 이용하고 여러개의 액티비티들을 이용해서 탭을 만들수 있었지만, 지금 처럼 아주 간결하게 만들기가 쉽지는 않았다.


액티비티 하나에 Fragment들을 탭의 개수 만큼 구현하고, 그리고 가장 중요한 ActionBar 모드를 ActionBar.NAVIGATION_MODE_TABS로 설정해주면 간단하게 탭을 구현할수 있다.





너무 간단하니까.. 바로 소스를 보고 따로 구현하도록 하면 될듯하다.

 1. 탭들을 등록하고 관리하는 Activity 하나.

 2. 탭들을 표현할 Fragment 들이 탭의 개수만큼(위에서는 3개)

 3. TabListener 하나.




FragmentTabs Activity.

package com.hopeisagoodthing.actionbar.tab;

import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;

public class FragmentTabs extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		final ActionBar actionBar = getActionBar();
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

		actionBar.addTab(actionBar
				.newTab()
				.setText("Tab1")
				.setTabListener(
						new TabListener<FragmentTab1>(this, "tab1",
								FragmentTab1.class)));
		actionBar.addTab(actionBar
				.newTab()
				.setText("Tab2")
				.setTabListener(
						new TabListener<FragmentTab2>(this, "tab3",
								FragmentTab2.class)));
		actionBar.addTab(actionBar
				.newTab()
				.setText("Tab3")
				.setTabListener(
						new TabListener<FragmentTab3>(this, "tab3",
								FragmentTab3.class)));

		if (savedInstanceState != null) {
			actionBar.setSelectedNavigationItem(savedInstanceState.getInt(
					"selectedTab", 0));
		}
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putInt("selectedTab", getActionBar()
				.getSelectedNavigationIndex());
	}
}



FragmentTab1

package com.hopeisagoodthing.actionbar.tab;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class FragmentTab1 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.simple, container, false);
		View tv = v.findViewById(R.id.text);
		((TextView) tv).setText("coolkim.tistory.com");
		return v;
	}
}



FragmentTab2

package com.hopeisagoodthing.actionbar.tab;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class FragmentTab2 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.simple, container, false);
		View tv = v.findViewById(R.id.text);
		((TextView) tv).setText("Hope is a good thing.");
		return v;
	}
}



FragmentTab3

package com.hopeisagoodthing.actionbar.tab;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class FragmentTab3 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.simple, container, false);
		View tv = v.findViewById(R.id.text);
		((TextView) tv).setText("Simple Tab");
		return v;
	}
}



TabListener

package com.hopeisagoodthing.actionbar.tab;

import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.app.ActionBar.Tab;
import android.widget.Toast;

public class TabListener<T extends Fragment> implements ActionBar.TabListener {

	private final Activity mActivity;
	private final String mTag;
	private final Class<T> mClass;
	private Fragment mFragment;

	public TabListener(Activity activity, String tag, Class<T> clz) {
		mActivity = activity;
		mTag = tag;
		mClass = clz;

		mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
		if (mFragment != null && !mFragment.isDetached()) {
			FragmentTransaction fragmentTransaction = mActivity
					.getFragmentManager().beginTransaction();
			fragmentTransaction.detach(mFragment);
			fragmentTransaction.commit();
		}
	}

	public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {
		if (mFragment == null) {
			mFragment = Fragment.instantiate(mActivity, mClass.getName(), null);
			fragmentTransaction.add(android.R.id.content, mFragment, mTag);
		} else {
			fragmentTransaction.attach(mFragment);
		}
	}

	public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) {
		if (mFragment != null) {
			fragmentTransaction.detach(mFragment);
		}
	}

	public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) {
		Toast.makeText(mActivity, "onTabReselected!", Toast.LENGTH_SHORT)
				.show();
	}
}

'코딩하고 > Android' 카테고리의 다른 글

HttpClient 사용하기  (0) 2012.10.25
File Observer 사용하기  (0) 2012.10.21
App에서 SystemProperties 가지고 오는 방법  (1) 2012.10.18
검색 API 사용하기 - twitter api  (0) 2012.10.05
검색 API 사용하기 - google api  (0) 2012.10.05
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,



앱을 만들다 보면, 안드로드이가 제공하는 SystemProperties의 값을 읽어와서 해단 단말이 지원하는 피쳐에 따른 설정을 다르게 해줘야 하는 경우가 간혹있다.


플래폼이 빌드될때 같이 빌드 되는 앱이라면 바로 CSC 또는 SystemProperties에 접근할수 있는 앱으로 만들어서 플래폼에 같이 포함되게 할수도 있지만, 그렇지 않은 경우는 다음과 같이 간단한 방법으로 사용할수 있다.



import java.lang.reflect.Method;

       try{          
	          Class SystemProperties = getApplicationContext().getClassLoader().loadClass("android.os.SystemProperties");

	          Class[] types= new Class[1];
	          types[0]= String.class;
	          Object[] params= new Object[1];
	          params[0]= new String("[가지고 오고 싶은 프로퍼티:예를 들면 ro.build.display등등등....]");

	          Method get = SystemProperties.getMethod("get", types);
	          String value= (String) get.invoke(SystemProperties, params);

	  }catch( Exception e ){
	  }
끝!!!! 그런데 가지고 올 프로퍼티 값이 없으면 null이 아니고 그냥 아무것도 없는 값이 리턴된다. 공백.

'코딩하고 > Android' 카테고리의 다른 글

File Observer 사용하기  (0) 2012.10.21
ActionBar로 Tab 만들기  (19) 2012.10.19
검색 API 사용하기 - twitter api  (0) 2012.10.05
검색 API 사용하기 - google api  (0) 2012.10.05
검색 API 사용하기 - naver api.  (2) 2012.10.04
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

최근 개인 프로젝트를 하나 진행할 일이 있어, 안드로이드용으로 unit test를 진행하던중 검색 엔진을 직접 사용하는 방법에 대해서 한번 정리가 필요할 것 같아서 정리해본다. 


그 첫 번째 포스팅으로 이번은 DAUM api에 한해서만 정리한다.


일단 DAUM에서 제공하는 API를 사용하려면 다음 주소로 가서 한번 전체적으로 쑤욱 훓어봐야 한다.

http://dna.daum.net/apis/view_all   --> 여기는 전체 API들이 나오는곳

http://dna.daum.net/apis/search  --> 검색 API는 여기로~~


나는 검색 엔진만 사용할것이니까, 검색 API로 가서 한번 쑥 훓어보고 왔다. 사실 별거 없었다 .=_=






package com.hopeisagoodthing.searchtool;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


public class DaumSearch implements ISearch
{
	private static final String TAG = "DaumSearch";
	private static final String BASE_URL = "http://apis.daum.net/search/";
	private static final String[] TARGETS=new String[]{"web?","blog?","board?","cafe?",};
	private static final String API_KEY="여기에자신의api key값을 넣어주면 됨";
	private static final String OUTPUT = "json";
	private static final class PARAM{
		private static final String API_KEY = "apikey=";	// always start with this parameter!!!
		private static final String OUTPUT = "&output=";
		private static final String QUERY = "&q=";		
		private static final String RESULT = "&result=";
	}	
	private static final String CHANEL = "channel";	        // json obj
	private static final String ITEM = "item";				// json array.
	private static final String DESC = "description";		// json obj
	
	private final List<String> mAnalyzedList = new ArrayList<String>();
	
	@Override
	public List<String> getAnalyze(final String query, final int resultSize, final IAnalyzer analyzer) {		
		mAnalyzedList.clear();	

		final StringBuilder builder = new StringBuilder();
		for(String target:TARGETS)
		{
			URL url = null;
			try {
				url = new URL(	BASE_URL + target +
									PARAM.API_KEY+ API_KEY +
									PARAM.OUTPUT + OUTPUT+
									PARAM.QUERY + URLEncoder.encode(query, "UTF-8") + 
									PARAM.RESULT+resultSize);
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			
			builder.setLength(0);
			try {
				String line = null;
				URLConnection connection = null;
				BufferedReader reader = null;
				connection = url.openConnection();
				
				//connection.addRequestProperty("Referer", /* Enter the URL of your site here */);

				reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
				
				while((line = reader.readLine()) != null) {
					 builder.append(line);
					}
				
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		
		
			try {
				Log.e(TAG,"DAUM Result START============================================================");
				//Log.e(TAG,builder.toString());
				final JSONObject json = new JSONObject(builder.toString());
				final JSONObject resultsJson = json.getJSONObject(CHANEL);
				final JSONArray resultArray = resultsJson.getJSONArray(ITEM);
				
				final int arraySize = resultArray.length();
				for(int i = 0; i< arraySize ; i++)
				{
					final JSONObject result = resultArray.getJSONObject(i);
					final String content = result.getString(DESC);
					analyzer.analyze(content,mAnalyzedList);				
				}
				Log.e(TAG,"DAUM Result END ============================================================");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}		
		return mAnalyzedList;		
	}	
}
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,