awacleberryの備忘録

アナログ人間のデジタル日記。

【Android】TextView の SetTextSize についてのメモ

TextView に 文字サイズを指定する方法についてのメモ。

getDimention して setTextSize をする

#setTextSize(float) にあるように、

void setTextSize (float size)

と引数一つの場合は、sp の指定となる。

dimens.xml で定義したサイズを取得する際に以下のようにするが、この返り値は px 変換されたものなので、都合が悪い。

getResources().getDimension(R.dimens.hoge);

次のようにすると、sp 値を px 値変換したものを sp 値として設定してしまうことになる(xml で sp 値を定義しているのが前提)。

tv.setTextSize (getResources().getDimension(R.dimens.hoge));

sp 値を px 値変換したものを px 値として渡すには、単位付きのメソッドを使用する。

void setTextSize (int unit, float size)

#setTextSize(int, float) にあるように、第1引数には、TypedValue で定義された定数を使う。

tv.setTextSize (TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimens.hoge));

こうすれば、一応意図した値を設定できる。

OS のフォントサイズ設定を無効にする

sp はディバイスで設定できるフォントサイズの倍率が掛けられるので、タブなどの限られた領域でフォントサイズを指定する場合には都合が悪い。

xml で sp 値を設定していて、かつ、OS のフォントサイズの影響を受けないようにするには、設定されている倍率を取得して割れば良さそう。

float scale = getResources().getConfiguration().fontScale;
tv.setTextSize (TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimens.hoge) / scale);

そもそも xml で dp 値として定義できれば、それでも良さそう。あるいは、dp の数値を float で取得できるなら、TypedValue.COMPLEX_UNIT_DIP の単位指定をし、

float dpVal = 20;
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, dpVal);

とかが考えられそう。

【Android】WebView にキャッシュをさせない方法

サイト更新後すぐに反映させたい場合などに、WebView がキャッシュを表示してしまうと困る。

WebView にキャッシュをさせないようにするには、CacheMode に LOAD_NO_CACHE を指定する。

WebView wv = (WebView)this.findViewById(R.id.webview);
wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

【Android】View の id とエントリ名の変換

エントリ名から id を取得

hoge というエントリ名から、R.id.hoge という id の数値を取得するなら、

int viewId = getResources().getIdentifier("hoge", "id", getPackageName());

この viewIdfindViewById(viewId) できる。for で連番しているエントリ名などから View を取得するのに便利。

id からエントリ名を取得

逆に、id の数値からエントリ名を取得するなら、

String viewIdStr = getResources().getResourceEntryName(viewId);

View から getId() とかで id さえ取得していれば、それを上記のようにエントリ名へ変換して正規表現でチェックとかできる。

他のリソース

View の id 以外でもできる。

int strId = getResources().getIdentifier("hoge", "string", getPackageName());

注意点

getIdentifier について、ドキュメント曰く、

Note: use of this function is discouraged. It is much more efficient to retrieve resources by identifier than by name.

オススメできない方法とのこと。

getIdentifier

Mac の ターミナルで tree を表示

tree をインストー

brew install tree

tree を表示

当該ディレクトリで、

tree

パスを指定するなら、

tree .

など。日本語が文字化けする際は、

tree . -N

でOK。表示するディレクトリの深さをしていするなら、

tree -L LEVEL

次のような感じに表示される。

.
├── CHANGELOG.md
├── LICENSE
├── README.md
├── assets
│   ├── fonts
│   ├── images
│   ├── javascripts
│   └── stylesheets
├── eyeglass-exports.js
└── package.json

パスを書く必要がある際には便利。他、使いそうなオプションは、

オプション
-a 隠しファイルも表示
-d ディレクトリのみ表示
-P 正規表現にマッチするものを表示
-F ディレクトリ末尾にスラッシュを表示
-o 書き出し

Android の apk 出力で Unsupported major.minor version 52.0 エラー

出力する apk ファイルの量が多いので、コマンドラインから gradle 使ってビルドをすることが多いけど、今回急に次のエラーが出て戸惑った。

A problem occurred evaluating project ':app'.
> java.lang.UnsupportedClassVersionError: me/tatarka/RetrolambdaPlugin : Unsupported major.minor version 52.0

結論だけ言えば、java8 を使えば解消される。 以下が詳しくて助かった。

Androidアプリのビルドで「Unsupported major.minor version 52.0」のビルドエラーが発生する

webpack をサクッと使う手順


webpack の基本操作 にて述べた方法で、効率良く開発環境を整える手順を改めてまとめておく。

要件は、

  • js モジュールの統合と単一書き出し
  • sass の 統合と css 単一書き出し
  • compass の読み込み
  • js, css のミニマイズ
  • js, css の map ファイルの生成
  • ES6 -> ES5 トランスパイル(コンパイル
  • jquery の読み込み
  • watch で変更を監視

完成後のディレクトリ構成(ビルド前)は次のようになる。

project/
    ├── _css
    │     ├── entry.sass
    │     └── sub.sass
    ├── _js
    │     ├── entry.js
    │     └── sub.js
    ├── css
    ├── js
    ├── node_modules
    ├── package.json
    ├── webpack_index.html
    └── webpack.config.js
  • ビルド前の各モジュールは _(アンダースコア)から始まるディレクトリに入れる
  • ビルド後のファイルは、それぞれ js, css ディレクトリに格納される
  • webpack_index.html は確認用の html

0. ディレクトリとテストファイルの準備

# 各ディレクトリ
mkdir {_css,_js,css,js}
# テスト用 html
echo '<html><link rel="stylesheet" media="all" href="./css/style.css"><body><h1></h1></body><script src="./js/bundle.js"></script></html>' > webpack_index.html
# entry.scss
echo '@import "compass"; @import "sub"; h1 { @include inline-block; color: #f00; }' > _css/entry.scss
# sub.scss
echo '@import "compass"; h1 { background-color: #000; }' > _css/sub.scss
# entry.js
echo 'var $ = require("jquery"); $(function(){$("h1").text(require("./sub.js"));});' > _js/entry.js
# sub.js
echo 'module.exports = "OK";' > _js/sub.js
  • webpack_index.html ではビルド後の js と css の読み込みの他、h1 タグを用意しておく
  • entry.scss では sub.scss を読み込む他、h1 を赤字に、また compass で inline-block にする
  • sub.scss では h1 の背景を黒にする
  • entry.js では jquery の読み込みの他、sub.js の出力を h1 にセットする
  • sub.js は “OK” を返す
  • ビルド後のイメージは次の感じ

スクリーンショット 2017-06-01 6.41.20.png

1. package.json を作る

-y オプションを付けて対話をせずに、初期化する。

npm init -y

2. devDependencies に追加する

npm install --save-dev webpack babel-loader babel-core babel-preset-es2015 node-sass style-loader css-loader sass-loader extract-text-webpack-plugin compass-mixins

それぞれ、

  • webpack 本体

    • webpack
  • ES6 対応

    • babel-loader
    • babel-core
    • babel-preset-es2015
  • sass 対応
    • node-sass
    • style-loader
    • css-loader sass-loader
  • sass -> css 書き出し対応
    • extract-text-webpack-plugin
  • compass 対応

3. dependencies に追加する

npm install jquery --save

4. package.json を修正

...
"private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --optimize-minimize"
  },
...
  • プライベート用にして警告排除
  • "private": true
  • ビルドファイルのミニマイズ設定
  • "build": "webpack --optimize-minimize"

5. webpack.config.js を置く

var path = require('path');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = [
    /**
     * js
     */
    {
        entry: "./_js/entry.js",
        watch: true,
        output: {
            path: path.join(__dirname, './js'),
            filename: "bundle.js"
        },
        module: {
            loaders: [{
                test: /\.js[x]?$/,
                exclude: /node_modules/,
                loader: 'babel-loader?presets[]=es2015'
            }]
        },
        devtool: 'source-map'
    },
    /**
     * Sass
     */
    {
        entry: './_css/entry.scss',
        watch: true,
        output: {
            path: path.join(__dirname, './css'),
            filename: 'style.css'
        },
        module: {
            loaders: [{
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract({
                    use: [{
                            loader: 'css-loader'
                        },
                        {
                            loader: 'sass-loader',
                            options: {
                                includePaths: ['node_modules/compass-mixins/lib']
                            },
                        }
                    ],
                    fallback: 'style-loader'
                })
            }]
        },
        plugins: [
            new ExtractTextPlugin('style.css')
        ],
        devtool: 'source-map'
    }
];

6. ビルドして確かめる

npm run build

実行後、webpack_index.html をブラウザで開き、

スクリーンショット 2017-06-01 6.41.20.png

と表示されれば、js, sass ともにビルドができている。

また、js/bundle.js, css/style.css はそれぞれミニマイズされていて、かつ同階層に map ファイルも出力されていれば問題ない。