2015年3月30日 星期一

【Android】Widget製作時鐘

這次要來用Widget來製作一個小時鐘,主要會用到下面幾個項目知識

  • Widget
  • Handler
  • Service
我們的目標是顯示現在的時刻
Ex : 2015/05/12 17:00

需要在code裡不斷的重新更新時間,下面這段code就是new出一個新的時間並設定我們需要的格式。

new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" ).format( new Date())

在Widget的部分主要是要intent Service交由Service去處理我們的每秒更新與背景。

Widget.java

public class SmsWidget extends AppWidgetProvider {
   
    Context context_main ;
    AppWidgetManager app_manager;
    int []appWidgetId;
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
       
        
        app_manager = appWidgetManager;
        context_main = context;
        appWidgetId = appWidgetIds;

       //new出一個 intent並將Widget的context傳入
        Intent intent = new Intent(context_main,WidgetService.class);
 //Intent執行service服務
context_main.startService(intent);


    }

    @Override
    public void onEnabled(Context context) {
       
    }

    @Override
    public void onDisabled(Context context) {
        //當WidgetDisable時關閉service服務
        Intent intent = new Intent(context_main,WidgetService.class);
        context_main.stopService(intent);
    }
}


那我們要如何不斷的new出新的時間並更新widget的view ?
其實只要用handler來處理即可,並搭配Service讓code在背景執行,執行一次就更新一秒。


Service.java

public class WidgetService extends Service {
    private Handler mHandlerBoss = null;
    private HandlerThread mHandlerEmployee = null;
    private String EmployeeName = "John";
    public WidgetService() {
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //service結束,結束handler
        mHandlerBoss.removeCallbacks(mRunnable);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //建立Handler
        //Handler簡單來說就是需要老闆、員工、工作
        //建立一個員工
        mHandlerEmployee = new HandlerThread(EmployeeName);
        //員工上班
        mHandlerEmployee.start();
        //建立一個老闆,老闆聘員工上班
        mHandlerBoss = new Handler(mHandlerEmployee.getLooper());
        //老闆指派工作給員工
        mHandlerBoss.post(mRunnable);
        return super.onStartCommand(intent, flags, startId);
    }
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            //更新Widget畫面
            buildUpdate();
            //每秒跑一次
            mHandlerBoss.postDelayed(this,1000);
        }
    };
    private void buildUpdate()
    {
        
        RemoteViews view = new RemoteViews(getPackageName(), R.layout.sms_widget);
        view.setTextViewText(R.id.appwidget_text, new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" ).format( new Date()));

        ComponentName thisWidget = new ComponentName(this, SmsWidget.class);

        AppWidgetManager manager = AppWidgetManager.getInstance(this);

        manager.updateAppWidget(thisWidget, view);
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

編譯成功後就能夠在,手機裡將Widget拉出來使用。

參考連結:
Widget Update http://stackoverflow.com/questions/4866305/android-widget-update
背景執行 http://cooking-java.blogspot.tw/2010/04/android-service.html



【Android】如何新增分隔線於layout中


在html中常見的分隔線,於android layout中要如何設置



相當簡單於xml檔中加入以下的code即可顯示出一條分隔線

<view
   android:background="#000000"
   android:layout_height="2dp"
   android:layout_width="fill_parent"
</view>






參考:

2015年3月28日 星期六

【Android】Widget 簡單範例



Widget就是在手機上常看到的小工具,可以放入主頁,使用Android Studio就可以簡單的建立一個Widget。

一、

建立一個project就照之前的方式建立起來,在選擇Activity的地方可以選擇add no ,就是不建立Activity。


二、

在java->你的package上點選右鍵,找到New新建一個Widget,











其中分別有
  • Class Name (名稱)
  •  Placement(放置位置)
    • Home screen (手機畫面位置) 
    • Keyguard(手機解鎖位置) 
    •  Home screen & Keyguard (兩者皆可)
  •  Resizable (是否能夠調整大小)
         ※放置桌面後是否能夠調整大小
  •  Width&Height(桌面佔用大小)

就依造自己的需求選擇,完成後按下FINSH,Android Studio就會幫你建立起來。



三、

建立後會看到新增了三項東西,分別是:
  • NewAppWidget.java 
  • NewAppWidget.xml (Widget介面設計)
  • NewAppWidget_Widget.info.xml (Widget的資訊)


參考連結:







【Android_Error】error: Handler is abstract; cannot be instantiated


在使用Android Studio寫Handler時,一直出現這個錯誤,後來發現是Android Studio自動import錯誤的package。



Android Studio import

  • import java.util.logging.Handler;
但應該是要使用
  • import android.os.Handler;
所以將import修正一下錯誤就消失了

大家參考參考


參考連結:

2015年3月4日 星期三

【Android】XML中android:layout_gravity與android:gravity的差別


android:layout_gravityandroid:gravity這兩者的區別在於,一個影響的是物件對layout的反應,另一個則是物件對自身text的反應

舉例來說:
現在我們有一個Linearlayout及一個button,分別為layout與view


  • android:layout_gravity="center"
當你對button寫這個code代表,他會以Linearlayout為主,整個button對Linearlayout置中。
  • android:gravity="center"
這個code則是會使button內的text置中。

所以當我們想要讓view在layout裡置中則使用

  • android:layout_gravity="center"

當我們希望是button裡text置中則使用
  • android:gravity="center"

所以在android裡
android:layout_xxxxx屬性,是使view與layout做控制
android:xxxxx屬性,則是針對view內部的屬性做控制








參考:http://fecbob.pixnet.net/blog/post/39312567-android%3Agravity-%E5%92%8C-android%3Alayout_gravity