前回、ActionBarCompat-Styledを置き換えようとしたSlidingTabsBasicをやってみました。
[開発環境]
Android Studio
[使用したサンプル]
SlidingTabsBasic
[機能]
デザインのみ。
※view/SlidingTabLayout、SlidingTabLayoutはpackage名を変えてそのまま使うことにしました。
※Logとかはとりあえずそのまま使いました。
※残念ながらメニューがうまくでない。。。
Packegeを作る
このサンプルでは、Common\activiesという階層にSampleActivityBase.javaというファイルを置いていたので、
javaが選択された状態でNew->Packegeでjavaを選択し、OK。
common.activitiesを作成する。
デフォルトコンストラクタ
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を宣言しなければいけない
とコメントがでる。
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したができない。。。
ツリービューを以下のようにProjectに変えればdrawableにDrag & Dropでコピーすることができました。そしてdrawable/tileのエラーも消えました。
FragmentTransaction
Fragmentを切り替えて画面遷移を表現する場合には、以下のように別で作成したものを置き換える。
FragmentTransaction transaction =
getSupportFragmentManager().beginTransaction();
SlidingTabsBasicFragment fragment = new SlidingTabsBasicFragment();
transaction.replace(R.id.sample_content_fragment, fragment);
transaction.commit();
イメージとしては以下のような感じが気がする。
その他
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);
android:showAsAction=”always”
menu_main.xmlにandroid:showAsActionを記載したが以下のようにエラーになった。
<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 件のコメント :
コメントを投稿