だてブログ

ねことテクと趣味のブログ

高校時代一番好きだった曲 - Wherever I go

こんばんは。 日に日に寒さも増してきて周りでも風邪を引く人がちらほら出てきました。

さて、今回は私が高校時代によく聞いていた曲を紹介します。 なんとなーく、もうすぐ卒業だなって思って、そういう時によく聞いていた曲を思い出して引っ張り出してきた次第です。 この曲は、DesneyChannelで放映されていた"HannnaMontana"という海外ドラマのFinalSeasonの終盤でHannaが自分の正体を明かす際に歌った曲です。

なんか、、、この曲を聴くと、不思議と勇気が出るんですよね。 初めて聞いた時、実は歌詞の英語がよくわかっていなかったのですが、それでもなんとなくグッと元気が出てきました。 海外でも卒業ソングとして、今でもとても人気のある曲みたいです。 歌詞もとても力強い勇気付けられるそんな歌詞なので、ぜひ見ながら聞いて欲しいです。 たかがドラマの一曲かもしれないですが、騙されたと思って聞いて見てください(ステマ?笑)

Here we are now
いまここで
Everything is about to change
全てが変わろうとしている
We face tomorrow as we say goodbye to yesterday
昨日に別れを告げて明日に立ち向かわなきゃ
A chapter ending but the story's only just begun
一つの章は終わったけど、まだあなたの物語は始まったばかり
A page is turning for everyone
さぁページをめくろう 私たちのために

So I'm moving on
だから私はもう行くよ
Letting go
一緒に行こう
Holding on to tomorrow
明日を掴みとるために
I've always got the memories while I'm finding out who I'm gonna be
自分探しをしている時も思い出はたくさん持っているから
We might be apart but I hope you always know
離れ離れになってしまうけど一つだけ覚えていて欲しい
You'll be with me wherever I go
どこへ行こうとずっと一緒にいるよ
Wherever I go
ずっと一緒だよ

So excited I can barely even catch my breath
とても忙しくて一息つくこともできない
We have each other to lean on for the road ahead
この先の道でもお互い助け合って行こう
This happy ending is the start of all our dreams
このハッピーエンドは夢のはじまりで
And I know your heart is with me
あなたはずっと私と一緒にいてくれる

So I'm moving on
だから私はもう行くよ
Letting go
一緒に行こう
Holding on to tomorrow
明日を掴みとるために
I've always got the memories while I'm finding out who I'm gonna be
自分探しをしている時も思い出はたくさん持っているから
We might be apart but I hope you always know
離れ離れになってしまうけど一つだけ覚えていて欲しい
You'll be with me wherever I go
どこへ行こうとずっと一緒にいるよ

Its time to show the world we've got something to say
さぁ世界に向けていう時が来たよ
A song to sing out loud we'll never fade away
私たちの繋がりは絶対に消えないって歌った曲を
I know I'll miss you but we'll meet again someday
きっとさみしくなるけどいつか必ず会える
We'll never fade away
私たちはいなくなったりしないから

So I'm moving on
だから私はもう行くよ
Letting go
一緒に行こう
Holding on to tomorrow
明日を掴みとるために
I've always got the memories while I'm finding out who I'm gonna be
自分探しをしている時も思い出はたくさん持っているから
We might be apart but I hope you always know
離れ離れになってしまうけど一つだけ覚えていて欲しい
You'll be with me wherever I go
どこへ行こうとずっと一緒にいるよ
* 繰り返し

PS. この曲を歌う前後で、、、まぁ色々あってその辺のストーリーも見た上でこの曲を聴くと更に感動すると思います。

PreferenceScreenをネストすると外のレイアウトが崩れる

PreferenceFragmentを使った設定画面で、例えば、複数画面のPreferenceを簡単に作ろうとすると

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceScreen android:title="test1">
        <Preference android:title="test1-1">
        <Preference android:title="test1-2">
    </PreferenceScreen>
</PreferenceScreen>

とネストをかければ複数画面を作れますが、これだとネストされたPreferenceScreen画面には、親のPreferenceScreenでデザインしたであろうレイアウト(ActionBarやbuttombarなど)が適用されません。 そこで、親のPreference要素をクリックすると別のフラグメントに置き換えるという、従来のFragmentの切り替え方でなんとかしました。

SettingActivity.java

public class SettingActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // activity_setting.xmlはfragmentを入れるレイアウトxml
        setContentView(R.layout.activity_setting);
        getFragmentManager().beginTransaction().replace(R.id.fragment_container,
                new UserPreferenceFragment()).commit();
    }
}

class UserPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // preference_header.xmlは親の設定画面xml
        addPreferencesFromResource(R.xml.preference_header);
        Preference.OnPreferenceClickListener subpreference = new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                getPreferenceScreen().removeAll();
                switch(preference.getKey()) {
                    // preference_test1,2,3 は子の設定画面
                    case "test1":
                        addPreferencesFromResource(R.xml.preference_test1); break; 
                    case "test2":
                        addPreferencesFromResource(R.xml.preference_test2); break;
                    case "test3":
                        addPreferencesFromResource(R.xml.preference_test3); break;
                }
                return true;
            }
        };
        final Preference test1 = (Preference) findPreference("test1");
        final Preference test2 = (Preference) findPreference("tesst2");
        final Preference test3 = (Preference) findPreference("test3");
        test1.setOnPreferenceClickListener(subpreference);
        test2.setOnPreferenceClickListener(subpreference);
        test3.setOnPreferenceClickListener(subpreference);
    }
}

ホント地味にですが、setOnPreferenceClickListenerをできるだけきれいに、複数作るのに苦労しました。(ひとつずつ定義して当てはめるには量が多かったので)

参考:

f:id:Windnap:20170730180705j:plain

BottomNavigationViewのFragmentの中に更にTabとFragmentを作る

BottomNavigationViewを一回作り、その中にTabhostとそのフラグメントを作った際、ハマったのでメモ。
主に、一番下の参考を参照しましたが、いくつかエラーが発生したため修正を入れています。

まず、BottomNavigationViewで分けた各フラグメントのうち一つです。
親フラグメント.java

public class 親フラグメント extends Fragment {
    public static Record newInstance() {
        return new Record();
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.record, container, false);
        //FragmentManagerの取得
        FragmentManager mFragmentManager = getChildFragmentManager();
        //xmlからFragmentTabHostを取得、idが android.R.id.tabhost である点に注意
        FragmentTabHost tabHost = (FragmentTabHost)v.findViewById(android.R.id.tabhost);
        Log.d("tabHost", String.valueOf(tabHost));
        //ContextとFragmentManagerと、FragmentがあたるViewのidを渡してセットアップ
        tabHost.setup(getActivity().getApplicationContext(), mFragmentManager, R.id.content);
        //String型の引数には任意のidを渡す
        //今回は2つのFragmentをFragmentTabHostから切り替えるため、2つのTabSpecを用意する
        TabHost.TabSpec mTabSpec1 = tabHost.newTabSpec("tab1");
        TabHost.TabSpec mTabSpec2 = tabHost.newTabSpec("tab2");
        //Tab上に表示する文字を渡す
        mTabSpec1.setIndicator("This is tab1");
        mTabSpec2.setIndicator("This is tab2");
        Bundle args = new Bundle();
        args.putString("string", "message");
        //それぞれのTabSpecにclassを対応付けるように引数を渡す
        //第3引数はBundleを持たせることで、Fragmentに値を渡せる。不要である場合はnullを渡す
        tabHost.addTab(mTabSpec1, 子フラグメント1.class, args);
        tabHost.addTab(mTabSpec2, 子フラグメント2.class, null);
        return v;

    }
}

子フラグメント1.java

public class 子フラグメント1 extends Fragment {
    static 子フラグメント1 newInstance() {return new 子フラグメント1();}
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        //addTabの際にBundleを渡す場合は、Bundleから値を取得する
        //渡さない(nullを渡している)場合は、実装しなくてよい。そうでないとgetString("string")時にエラーが発生する
        Bundle args = getArguments();
        String str = args.getString("string");
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.子フラグメントレイアウト1, null);
    }
}

子フラグメント2.java

public class 子フラグメント2 extends Fragment {
    static 子フラグメント2 newInstance() {return new 子フラグメント2();}

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.子フラグメントレイアウト2, null);
    }
}

親フラグメントレイアウト.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- FragmentTabHostのidは必ず @android:id/tabhost にする-->
<android.support.v4.app.FragmentTabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- FragmentTabHost同様、idの指定あり。idは必ず @android:id/tabs にする-->
        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <!-- contentにFragmentが追加される-->
        <FrameLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>

    </LinearLayout>
</android.support.v4.app.FragmentTabHost>

子フラグメントレイアウト.xml (子フラグメントレイアウト1,子フラグメントレイアウト2)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="子フラグメント" />
</LinearLayout>

備考:
Fragment系は"android.app.Fragment~“と"android.support.v4.app.Fragment~"がありますが、どちらかに統一したほうが良いっぽいです(当たり前ですが。)
Android標準のFragmentよりsupport.v4.app.Fragmentを使うべき、という理由を徹底調査という記事を参考にして、わたしはv4を使っています。

参考:
qiita.com