2016年2月6日土曜日

PreferenceFragmentの評価


PreferenceFragmentの評価
Preference情報を基調としているPreferenceFragmentの評価はどうなのだろうか。
CheckBoxPreference等ごく限られた道具しかない。データの出し入れに特化したものだ。画面表示関係には弱い。
例えば、PreferenceScreenにButtonを配置したい場合、どうするのか。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        Preference preferenceButton = findPreference("PreferenceScreen_btnClose");
        preferenceButton.setLayoutResource(R.layout.preference_button);
        preferenceButton.setOnPreferenceClickListener(this);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public boolean onPreferenceClick(Preference preference){
        if(preference==findPreference("PreferenceScreen_btnClose")){
            //ここでButton押し下げ関係処理をする
            return true;
        }
        return false;
    }

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <Preference
        android:key="PreferenceScreen_btnClose"
        >
    </Preference>
</PreferenceScreen>

R.layout.preference_button
<?xml version="1.0" encoding="utf-8"?>
<Button
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:text="@string/aaaa"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="false"(必要)
    android:focusable="false"(必要)
    android:drawableStart="@android:drawable/ic_menu_close_clear_cancel"
    >
</Button>

単純にクリックするだけであれば悩まない。
複雑なViewGroupを表示・操作したい場合どうするのか。
Preferenceを拡張して行うということである。職人技ですね。普通のプログラマーが自力だけでこのコードを書けるとは思えない。
「複雑な形状のViewの表示は別途画面を設けてください」というのが、本システム設計者の考え方かもしれない。



SharedPreferences

SharedPreferences

SharedPreferencesを用いてデータを保存する方法は2通りある。

その1.
Context.getSharedPreferences("thisName", Context.MODE_PRIVATE)を使う方法
簡単なサンプルは次のとおりです。
boolean b;
SharedPreferences sp;
sp = con.getSharedPreferences("thisName", Context.MODE_PRIVATE);
b = sp.getBoolean("thisKey", false);

その2.
PreferenceManager.getDefaultSharedPreferences()を使う方法
データを簡単に保存する方法(Preference編)

両者の違いは次のサイトに解説されている。
Difference between getDefaultSharedPreferences and getSharedPreferences
保存する名前(保存先)が異なるとのことである。機能に違いは無い。各々独立したデータとして取り扱うことになる。

仕掛け
Preferencesによるデータはファイルに保存される。
このファイル名は、Context.getSharedPreferences()であれば、その第一引数に指定した文字列になる。
PreferenceManager.getDefaultSharedPreferences()の場合は、context.getPackageName() + "_preferences"という、固定された名前(プログラマーが指定できない名前)になる。

このような名前を持つファイルの中に、任意の個数の、任意の名前のKeyが存在することになる。各々のKeyには、1個の何らかの値がくっついている。
Keyを指定することにより、値を操作することができる。

保存先がファイルであるから、複数設けるとアクセスに時間がかかるかもしれない。ファイルは1個にまとめれば効率的かもしれない。

PreferenceFragmentで使いたい場合
既にContext.getSharedPreferences()を用いてアプリを運用してしまっている場合であって、これをPreferenceFragmentで使用したい場合、取り扱うデータをContext.getSharedPreferences()で保存・読込ができるようにしなければならない。
\res\xml\preferences.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <CheckBoxPreference
        android:key="ここにContext.getSharedPreferences()で使っているKeyを設定する"
        android:title="...."
        android:summary="...."
        >
    </CheckBoxPreference>
</PreferenceScreen>

PreferenceFragment.java
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        PreferenceManager pm;
        cbQuit = (CheckBoxPreference)findPreference("キー");
        pm = cbQuit.getPreferenceManager();
        pm.setSharedPreferencesName("名前");//取り扱うファイル名を変更する。
        boolean "値" = "変更後のファイルのキーから値を取得する"
        cbQuit.setChecked("値");

チェックボックスが1個だけなら良いが、2個以上の場合、onPreferenceChange()においてしっかりと値を保存しておかねばならない(意味不明)。
        pbQuit.setOnPreferenceChangeListener(this);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue){
        if(preference==cbQuit){
            boolean b = (boolean)newValue;
            (ここで値を保存しておく)
            return true;
        }
        return false;
    }


2016年1月22日金曜日

MountService No primary storage defined yet hacking together a stub

MountService No primary storage defined yet hacking together a stub

Android 6.0のエミュレータで上記のエラーが発生します。
これが原因で他のアプリが動かなくなります。
解決方法は、このエラーが発生するエミュレータを捨てて、Android Virtual Device Managerで新規にエミュレータを作成してください。残念です。

2015年12月6日日曜日

Windows 10 KB3116908 0x80070570

Windows 10 KB3116908 0x80070570

これは、パソコンのWindows 10 のシステム更新に関する情報です。

x64 ベース システム用 Windows 10 バージョン 1511 の累積的な更新プログラム (KB3116908)
に関する更新をしようとすると、
エラーコード:(0x80070570)
が発生します。これに関する回答は次のサイトにあります。
Error code: (0x80070570) - When trying to download Win10 pro cumulative (KB3116908)

パソコンの"C:\Windows\SoftwareDistribution\Download"にあるフォルダーやファイルを全て削除すれば、上記エラーは無くなり、更新ができます。

2015年11月19日木曜日

.InstantiationException

InstantiationException

E/AndroidRuntime:  Caused by: java.lang.InstantiationException: java.lang.Class<xxxx.xxxx.xxxx> cannot be instantiated

上記のエラーが出ました。原因は、下記のように、abstractが付いてしまっていたためでした。これを消すと直りました。何かの拍子に自動的に付加されてしまったものです。

public abstract class MainActivity extends Activity

参考
java.lang.InstantiationException: can't instantiate class; no empty constructor

2015年11月4日水曜日

Resources: Converting to string: TypedValue

Resources: Converting to string: TypedValue

W/Resources: Converting to string: TypedValue{t=0x12/d=0x0 a=1 r=0x1020351}
上記のような警告がLogに表示されることがあります。
この警告が不要であれば、Android端末の「設定」>「開発者向けオプション」>「表示属性検査を有効にする」のチェックを外してください。

2015年11月3日火曜日

MiniThumbFile: Unable to create .thumbnails directory

MiniThumbFile: Unable to create .thumbnails directory

Android 6.0で上記エラーが発生しました。
AndroidManifest.xmlファイルに下記のとおり追記すると解決しました。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

参考