2016年12月17日 星期六

Ubuntu 14.04 無法停止睡眠(or 暫停Suspend)

老實說我一直覺得Ubuntu 14.04的電源管理問題很多,

要不是睡眠睡一睡就不醒,再不然就是睡起來就當機,滑鼠不用能…等

但這次遇到問題更褲了…要從操作介面上把"暫停"(Suspend)關閉

也就是當滑鼠鍵盤沒有任何動作,會讓電腦待機(或稱睡眠,就是讓硬碟暫時關閉)

設定完成後沒有反應,還是會自己待機,讓我實在是非常的困擾…

另外,我也搞了很久才發現電源管理有分成開機登入前登入後的兩種不同的設定方式

登入後說明如下:

無效操作如下圖所示:




解決方案大部份有二種:

方案一、

  1. 在Terminal下輸入「sudo gedit /etc/default/grub」,按下「Enter」(要使用vim編輯也可以)
  2. 修改內容: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=off apm=off"
  3. 存檔後關閉編輯視窗。
  4. 在Terminal下輸入「sudo update-grub」,按下「Enter」


方案二(建議作法)、

  1. 在Terminal下輸入「sudo apt-get install dconf-tools」,按下「Enter」
  2. 在Terminal下輸入「sudo dconf-editor」,按下「Enter」
    請在畫面左邊找到「org \ gnome \ settings-daemon \ plugins \ power」
    然後編輯右邊的內容將「sleep-inactive-ac-timeout」的值改成0,如下圖所示:
  3. 修改完後關閉視窗即可。
參考網址:
http://superuser.com/questions/348857/ubuntu-11-10-put-computer-to-sleep-when-inactive-for-4-hours

http://askubuntu.com/questions/99007/how-can-i-set-my-system-to-suspend-when-inactive-to-a-longer-amount-of-time
 說明:方案一的作法是直接關閉電源管理的功能,所以當使用者關機之後會無法自動斷電,必須要自己按電源鍵。方案二的作法就沒有這個問題,所以比較建議使用方案二。



登入前說明如下:

打開Terminal之後輸入以下指令:

sudo -H -u lightdm dbus-launch --exit-with-session gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0

sudo service lightdm restart

解決.....




2016年5月11日 星期三

Android AlertDialog 按鈕設定文字大小

如下圖紅色方框所示,要讓AlertDialog的按鈕設定文字大小




請看下面程式碼:

AlertDialog.Builder datetimeDialog = new AlertDialog.Builder(PhrActivity.this);
LayoutInflater inflater = PhrActivity.this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.dialog_datetimepicker, null);
TextView tv_set_time = (TextView)dialogView.findViewById(R.id.tv_set_time);
tv_set_time.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.notif_tb_title_ts));
datetimeDialog.setView(dialogView);
datetimeDialog.setPositiveButton(getResources().getString(R.string.str_btn_set), new DialogInterface.OnClickListener()
{
    @Override
    public void onClick(DialogInterface dialog, int which)
    {


    }
});
datetimeDialog.setNegativeButton(getResources().getString(R.string.str_btn_cancel), null);

final AlertDialog ad = datetimeDialog.create();
ad.setOnShowListener(new DialogInterface.OnShowListener()
{
    @Override
    public void onShow(DialogInterface dialog)
    {
        
        ad.getButton(DialogInterface.BUTTON_POSITIVE)
        .setTextSize(TypedValue.COMPLEX_UNIT_SP, getResources()
        .getDimension(R.dimen.notif_tb_title_ts));

        ad.getButton(DialogInterface.BUTTON_NEGATIVE)
        .setTextSize(getResources()
        .getDimension(R.dimen.notif_tb_title_ts));
    }
});
ad.show();

這裡有兩個重點,第一個重點是程式碼:TextView tv_set_time ...
設定字體大小要注意使用getResources().getDimension()這個方法取得值的話會回傳px
tv_set_time.setTextSize()設定的值是sp,所以必須使另一個多載的方法設定:

TextView tv_set_time = (TextView)dialogView.findViewById(R.id.tv_set_time);
tv_set_time.setTextSize(
    TypedValue.COMPLEX_UNIT_PX, 
    getResources().getDimension(R.dimen.notif_tb_title_ts)
);

第二個重點就是,要搞清楚AlertDialog.Builder和AlertDialog建立的方式(因為我就是搞不清楚,哈)。以上面的例子,如果不設定button的文字大小只要寫datetimeDialog.show(),就可以跳出視窗,但要改文字大小,就要使用ad.show()

以下程式碼是錯的是錯的是錯的

final AlertDialog ad = datetimeDialog.create();
ad.getButton(DialogInterface.BUTTON_POSITIVE)
        .setTextSize(TypedValue.COMPLEX_UNIT_SP, getResources()
        .getDimension(R.dimen.notif_tb_title_ts));

ad.getButton(DialogInterface.BUTTON_NEGATIVE)
        .setTextSize(getResources()
        .getDimension(R.dimen.notif_tb_title_ts));

要先取得AlertDialog物件才能取得Button物件,但網路上很多都只有寫上述的寫法,但這樣子會回傳NullPointerException,正確應該要寫成是:

final AlertDialog ad = datetimeDialog.create();
ad.setOnShowListener(new DialogInterface.OnShowListener()
{
    @Override
    public void onShow(DialogInterface dialog)
    {
        
        ad.getButton(DialogInterface.BUTTON_POSITIVE)
        .setTextSize(TypedValue.COMPLEX_UNIT_SP, getResources()
        .getDimension(R.dimen.notif_tb_title_ts));

        ad.getButton(DialogInterface.BUTTON_NEGATIVE)
        .setTextSize(getResources()
        .getDimension(R.dimen.notif_tb_title_ts));
    }
});
ad.show();

要設定AlertDialog.setOnShowListener()然後才能在AlertDialog的創建時間設定button的文字大小。如果把ad.show()改成datetimeDialog.show()一樣會跳出視窗,但文字大小是不會改變的,要特別注意啊啊啊!!



2016年5月4日 星期三

Android TextClock & TableLayout & Button 文字置中失效

標題想了很久,不知道該下什麼比較好,直接講這個情況怎麼發生的。

我想要把Button放在TableLayout裡面排版,如果只是單純只有兩個元件,是沒有什麼問題

問題是如果再加上TextClock,點擊Button之後就會發生文字無法置中。請參考下圖所示:



問題發生是發生在加入TextClock之後,每次秒數在更新時候,Android會重新刷新View

但這時候Button的gravity屬性就會失效,我不確定是不是一個bug,還是我書沒念好,哈~

就只能暫時先解決一下。以下是參考的解決方法:


「main.xml」

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.hsiang.uitest.Main2Activity">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/textClock"
        android:layout_alignParentStart="true"
        android:layout_marginTop="80dp">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <Button
                android:layout_width="150dp"
                android:layout_height="80dp"
                android:text="點我啊笨蛋"
                android:id="@+id/button"
                android:layout_alignParentTop="true"
                android:layout_alignParentStart="true"
                android:textSize="20sp"
                android:gravity="center_horizontal"
                android:paddingTop="30dp"/>

            <Button
                android:layout_width="150dp"
                android:layout_height="80dp"
                android:text="點我啊笨蛋"
                android:id="@+id/button2"
                android:textSize="20sp"
                android:layout_centerVertical="true"
                android:layout_alignEnd="@+id/button"
                android:gravity="center_horizontal"
                android:paddingTop="30dp"/>
        </TableRow>
    </TableLayout>

    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@+id/analogClock"
        android:format12Hour="@string/time12format"
        android:format24Hour="@string/time24format"
        android:textSize="13sp"
        android:layout_marginLeft="@dimen/phr_tc1_ml"
        android:textColor="#898989"
        android:layout_alignTop="@+id/analogClock"
        android:id="@+id/textClock"/>

</RelativeLayout>




說明如下:

重點應該在於
android:gravity="center_horizontal"
 android:paddingTop="30dp"

要將同一個TableRow的Button都設定上面兩個屬性,但其實是無法真的將文字置中,

而是要靠android:paddingTop這個屬性來調整text的位置。


Platform Versions: 4.4, 4.3







2016年5月3日 星期二

Android EditText 隱藏鍵盤

一般來說有兩種做法:

1.使用者直接點擊EditText隱藏鍵盤,像是要用EditText選擇日期。
edittext.setInputType(InputType.TYPE_NULL);






2.使用者透過其他元件要讓EditText隱藏鍵盤




InputMethodManager imm =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);


Platform Versions: 4.4, 4.3