2015年6月13日土曜日

GoogleサンプルでAndroidアプリを学ぶ(SlidingTabsBasic)

GoogleサンプルでAndroidアプリを学ぶ(SlidingTabsBasic)

前回、ActionBarCompat-Styledを置き換えようとしたSlidingTabsBasicをやってみました。

[開発環境]
 Android Studio
[使用したサンプル]
 SlidingTabsBasic
[機能]
 デザインのみ。

※view/SlidingTabLayout、SlidingTabLayoutはpackage名を変えてそのまま使うことにしました。
※Logとかはとりあえずそのまま使いました。
※残念ながらメニューがうまくでない。。。


Packegeを作る

このサンプルでは、Common\activiesという階層にSampleActivityBase.javaというファイルを置いていたので、
javaが選択された状態でNew->Packegeでjavaを選択し、OK。
enter image description here

common.activitiesを作成する。
enter image description here

デフォルトコンストラクタ

LogWrapperクラスには、コンストラクタが定義されていないが、コンストラクタが1つも定義されていない場合は、
デフォルトコンストラクタと呼ばれる引数無しで中身が空のコンストラクタが自動で生成されるらしいので問題ないらしい。

参考
http://www.javadrive.jp/start/constructor/index4.html

Interface

インタフェース は、ある機能を実現するクラスが必ず実装するべきメソッドの名前や型といった作法のみを定義するもの。
インタフェースで定義されるメソッド(抽象メソッド)の実体は implements を用いた側のクラスで実装する必要がある。

public interface LogNode {
    public void println(int priority, String tag, String msg, Throwable tr);

}

public class MessageOnlyLogFilter implements LogNode {
}

実際にMessageOnlyLogFilterを作ってみると以下のようにinterfaceで定義したprintlnを宣言しなければいけない
とコメントがでる。 

enter image description here

drawable/tileでエラー

サンプルを真似してstyles.xmlにコーディングしていたが、以下のところでdrawable/tileがないと怒られた。

<item name="android:background">@drawable/tile</item>

テキストエディタでdrawableを検索するとオリジナルのSlidingTabsBasic/Application/build/intermediates/symbols/debug/R.txtに以下の記載がある。
int drawable tile 0x7f020001

R.txtにこれを記載する方法がわからないので、オリジナルをAndriod Studioで開いてみたところ以下のようにdrawableの下にtile.9.pngが置いてあった。

これを同じようにすればよいと思い、
SlidingTabsBasic/Application/src/main/res/drawable-hdpiに
tile.9.pngが置いてあったのでAndroid StudioでdrawableにコピーしようとDrag & Dropしたができない。。。
enter image description here

ツリービューを以下のようにProjectに変えればdrawableにDrag & Dropでコピーすることができました。そしてdrawable/tileのエラーも消えました。
enter image description here

enter image description here

FragmentTransaction

Fragmentを切り替えて画面遷移を表現する場合には、以下のように別で作成したものを置き換える。

 FragmentTransaction transaction = 
                getSupportFragmentManager().beginTransaction();
 SlidingTabsBasicFragment fragment = new SlidingTabsBasicFragment();
 transaction.replace(R.id.sample_content_fragment, fragment);
 transaction.commit();

イメージとしては以下のような感じが気がする。
enter image description here

その他

android:textSize

単位
px pixels 画面上のPixelがそのままの単位になる
dp(dpi) Density-independent Pixels ディスプレイ解像度の物理的な密度に応じた抽象単位
sp Scale-independent Pixels ユーザーのフォントサイズの設定により伸縮される。フォントサイズの指定では推奨される単位

9 patch

drawableにtile.9.pngを追加したがそもそも9.pngという拡張子を初めて見た。

9 patchというものらしく、画像が拡大される際に拡大される領域とそうでない領域を指定するものらしいです。

参考
http://d.hatena.ne.jp/tomorrowkey/20110501/1304245217

android:shadowColor

影の色

android:shadowDy

影をY方向にどれだけずらすか。負の値も指定可能。

android:shadowRadius

影の半径。大きいほどぼやける。

Widget.SampleMessage

????

android:lineSpacingMultiplier

改行時のテキストの行間の余白の高さの指定とのこと。

<item name="android:lineSpacingMultiplier">1.1</item>

transaction.replace

以下のようにしたが、Wrong 2nd argument type.というエラーがでている。
調べてみると、android.support.v4.app.Fragmentではなく、android.app.Fragmentがimportされていたので修正したら
エラーが消えました。
//import android.app.Fragment;
import android.support.v4.app.Fragment;

 SlidingTabsBasicFragment fragment = new SlidingTabsBasicFragment();
 //activity_main.xmlで定義したFrameLayoutをSlidingTabsBasicFragmentに取り替える。
transaction.replace(R.id.sample_content_fragment,fragment);

enter image description here

android:showAsAction=”always”

menu_main.xmlにandroid:showAsActionを記載したが以下のようにエラーになった。

enter image description here

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
    <item android:id="@+id/menu_toggle_log"
        app:showAsAction="always"
        android:title="@string/sample_show_log" />
</menu>

instanceof

logToggle.setVisible(findViewById(R.id.sample_output)instanceof ViewAnimator);

の意味が分からないので調べたところ、

findViewById(R.id.sample_output)がViewAnimatorだったら、
Trueということになります。

activity_main.xmlで以下のように宣言しているので当然Trueですが。

    <ViewAnimator
          android:id="@+id/sample_output"

setDisplayedChild

表示するためのChild viewを設定する。
以下のようになってるけど、どれが1?

if (mLogShown) {
    output.setDisplayedChild(1);
} else {
    output.setDisplayedChild(0);
}

0 件のコメント :

コメントを投稿