본문 바로가기

Application Programming Interface/Android

위젯과 액티비티간의 데이터 교환 예제

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

Activity 측의 코드

 // MainActivity.java
package com.example.widgettest;

import android.app.*;
import android.appwidget.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;

public class MainActivity extends Activity
{
	private TextView textView1 = null;
	private EditText editText1 = null;
	private Button button1 = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		this.textView1 = (TextView)this.findViewById(com.example.widgettest.R.id.textView1);
		this.editText1 = (EditText)this.findViewById(com.example.widgettest.R.id.editText1);
		this.button1 = (Button)this.findViewById(com.example.widgettest.R.id.button1);
		
		// 버튼 클릭할 경우
		this.button1.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 액티비티와 Widget간의 데이터 전달 매개체로 SharefPreferences를 사용합니다. 코코아 프레임워크의 NSUserDefaults에 해당합니다.
				SharedPreferences sharedPreferences
					= MainActivity.this.getSharedPreferences("com.example.widgettest.sharedPreferences", Context.MODE_WORLD_WRITEABLE);
				SharedPreferences.Editor editor = sharedPreferences.edit();
				// 에디터를 사용해 editText1에 있는 문자열을 textBox라는 이름으로 SharedPreferences에 저장합니다.
				editor.putString("textBox", MainActivity.this.editText1.getText().toString());
				editor.commit();
				
				// Widget에게 값이 변경되었으니 업데이트하라는 메시지를 Broadcast를 통해 전달합니다.
				Intent intent = new Intent(MainActivity.this, Widget.class);
				intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
				MainActivity.this.sendBroadcast(intent);
			}
		});
	}
}

 

 

2. Widget측의 코드

// WidgetProvider.java
package com.example.widgettest;

import android.app.*;
import android.appwidget.*;
import android.content.*;
import android.widget.*;

public class WidgetProvider extends AppWidgetProvider
{
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
	{
		// TODO Auto-generated method stub
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		
		for (int appWidgetId : appWidgetIds)
		{
			RemoteViews remoteViews = new RemoteViews(context.getPackageName(), com.example.widgettest.R.layout.widget);
			
			Intent intent = new Intent(context, MainActivity.class);
			PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
			remoteViews.setOnClickPendingIntent(R.id.button1, pendingIntent);
			
			// 새로 고침 작업을 별도의 메서드로 빼기
			this.refresh(context, remoteViews);
			// 새로 고침 작업이 완료 후 위젯에게 업데이트 할 것을 통지
			appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
		}
	}
	
	private void refresh(Context context, RemoteViews remoteViews)
	{
		// Activity에서 만든 것과 같은 식별자를 갖는 SharedPreferences를 생성
		SharedPreferences sharedPreferences = context.getSharedPreferences("com.example.widgettest.sharedPreferences", Context.MODE_WORLD_WRITEABLE);
		// textBox라는 이름을 갖는 문자열 변수가 있다면 그것을 가져오고, 없으면 기본값으로 "HaHaHa"를 반환
		// 반환된 문자열은 위젯에서 textView1이라는 TextView에 전달
		remoteViews.setTextViewText(com.example.widgettest.R.id.textView1, sharedPreferences.getString("textBox", "HaHaHa"));
	}
}

 

실행 결과