Android Layoutフォルダーにサブフォルダーを含めることはできますか?


551

現在、すべてのxmlレイアウトファイルをres/layoutフォルダー内に格納しているため、小さなプロジェクトを管理することは現実的で簡単ですが、大規模で重いプロジェクトの場合は、内部に階層とサブフォルダーが必要です。レイアウトフォルダー。

例えば

layout
-- layout_personal
   -- personal_detail.xml
   -- personal_other.xml
--layout_address
  -- address1.xml
  -- address2.xml

同じように、大きなアプリケーション用にサブフォルダーを用意したいので、androidプロジェクト内でサブフォルダーを作成する方法はありますか?

レイアウトフォルダー内にlayout-personalおよびlayout_addressサブフォルダーを作成できますが、R.layout ._______を使用してxmlレイアウトファイルにアクセスするとき、その時点ではxmlレイアウトポップアップはありませんメニュー。



このリンクが詳細に役立つと思います。blog.mindorks.com/...
ディリップPoudel

回答:


475

あなたはgradleでこれを行うことができます。私が作ったデモプロジェクト様子を。

トリックは、gradleの機能を使用して複数のリソースフォルダーマージし、sourceSetsブロックでネストされたサブフォルダーと同様にresフォルダーを設定することです。

奇妙なことに、そのフォルダーの子リソースフォルダーを宣言する前に、コンテナーリソースフォルダーを宣言することはできません。

以下は、デモのbuild.gradleファイルのsourceSetsブロックです。サブフォルダーが最初に宣言されていることに注意してください。

sourceSets {
    main {
        res.srcDirs =
        [
                'src/main/res/layouts/layouts_category2',
                'src/main/res/layouts',
                'src/main/res'
        ]
    }
}

ネストされたリソースの画像

また、実際のリソースファイル(png、xmlレイアウトなど)の直接の親も、仕様に対応している必要があります。


6
ドローアブルフォルダでこれを行うことは可能ですか?宣言の順序を考慮に入れても、運が悪かっただけです。
trevor-e 2014

7
いいね!リソースフォルダーをマージするGradleの機能のみを実際に利用していることを思い出してください。
eski 2014

5
フォルダー内のファイル名は依然として一意である必要があり、コードでR.layout.list_itemは、たとえばmoviescinemasフォルダーからのものであることを知っている必要があるため、フラットな命名が引き続き適用されます。
TWiStErRob 2014年

5
あいにくと私のために動作しないことbuild:gradle:0.14.4buildToolsVersion "21.1.1"
Kamil Lelonek 2014年

32
この作品は、しかし、答えはありませんはなはだあなたがニーズを追加することを各サブフォルダを持っていることを説明の不十分な仕事だけ「レイアウト」と呼ぶことができるそれのサブフォルダの内部を、そしてあなたのレイアウトファイルのすべてが内部を移動する必要があります2番目のサブフォルダー。何十ものコメントを読んでそれを解決するのは理想からほど遠いです。そして、まだ探している人にとっては、追加の「レイアウト」サブフォルダを設定することがURI is not registered問題の解決策です。
2016

233

答えはノーだ。

この本のプロAndroid 2に注目してください。

また、リソースに関するいくつかの制約にも注意する必要があります。まず、Androidは、resの下の事前定義されたフォルダー内のファイルの線形リストのみをサポートします。たとえば 、レイアウトフォルダーの下のネストされたフォルダー(またはresの下の他のフォルダー)はサポートされません

2番目に、resの下のassetsフォルダーとrawフォルダーの間にはいくつかの類似点があります。両方のフォルダーにrawファイルを含めることができますが、raw内のファイルはリソースと見なされ、アセット内のファイルはそうではありません。

Assetsフォルダーの内容は リソースとは見なされないため、フォルダーとファイルの任意の階層をその中に置くことができます


3
次に期待するのは、ファイル名の接頭辞に基づいてファイルを折りたたむことができるEclipseまたはIntelliJプラグインです。
ジェリーブレイディ

15
@Justinが、gradleに投稿したソリューションを確認してください。
2014年

ファイルを分類したいようにファイルに名前を付けると、サブフォルダーにあるように見えるかもしれません。名前の最初に「サブフォルダタグ」を追加します。例えば。すべてのアクティビティは "activity_activityname.xml"となり、子アクティビティは "activity_activityname_childactivity.xml"となります。その他のファイルは「other_filename.xml」になります。それが私が混乱を避けるためにやっていることです。くそー、誰かが私を殴った。3年までに>。<私の悪い、それを見ていなかった。
Vedavyas Bhat 14

1
ここではraw、リソースと見なすことにより、密度、方向、バージョンなどの依存するストライピングを取得しassetsますが、手動で行う必要があることに注意してください。
TWiStErRob 2014年

1
Androidの主流をいじくり回すことに反対する議論としてこの答えを選びました。
Zon

77

私は問題を抱えている人々のためのeskisの素晴らしい答えを付け加えたかっただけです。(注:これは機能し、「プロジェクト」ビュー内の別のディレクトリのように見えますが、残念ながら「Android」ビューではありません。)

以下でテストされています。BuildToolsVersion = 23.0.0 gradle 1.2.3&1.3.0

これは、すでにビルドされたプロジェクトで作業する方法です。

  1. すべてのXMLファイルをレイアウトディレクトリからコピーし、デスクトップ上のディレクトリまたはバックアップ用のディレクトリに配置します。
  2. レイアウトディレクトリ全体を削除します(手順1からすべてをバックアップしたことを確認してください!!!)
  3. resディレクトリを右クリックし、[新規]> [ディレクトリ]を選択します。
  4. この新しいディレクトリに「layouts」という名前を付けます。(これは何でもかまいませんが、後で提供される「フラグメント」ディレクトリや「アクティビティ」ディレクトリにはなりません)。
  5. 新しい「レイアウト」ディレクトリを右クリックし、[新規]> [ディレクトリ]を選択します。(これは、「フラグメント」や「アクティビティ」など、XMLファイルの種類の名前になります)。
  6. 「フラグメント」または「アクティビティ」ディレクトリを右クリックします(注:「フラグメント」または「アクティビティ」である必要はありません。これは、例として使用しているものだけです)、もう一度「新規」>「ディレクトリ」を選択し、このディレクトリに名前を付けます"レイアウト"。(注:これは「レイアウト」という名前にする必要があります!!!非常に重要です)。
  7. デスクトップに作成したバックアップから、新しい「レイアウト」ディレクトリ内に必要なXMLファイルを配置します。
  8. 必要な数のカスタムディレクトリについて、手順5〜7を繰り返します。
  9. これが完了したら、モジュールのgradle.buildファイルに移動して、次のようなsourceSets定義を作成します...(「src / main / res / layouts」と「src / main / res」が常に下の2つになることを確認してください!! !!以下に示すように)。

    sourceSets {
        main {
            res.srcDirs =
                    [
                            'src/main/res/layouts/activities',
                            'src/main/res/layouts/fragments',
                            'src/main/res/layouts/content',
                            'src/main/res/layouts',
                            'src/main/res'
                    ]
        }
    }
    
  10. 利益$$$$

しかし真剣に..これは私がそれを機能させた方法です。ご不明な点がございましたら、お気軽にお問い合わせください。サポートさせていただきます。

写真は言葉よりも価値があります。

ディレクトリ構造


1
などのレイアウトディレクトリはlayout-v21どうですか?
Akshay Chordiya

4
テストはしていませんが、layout-v21フォルダーをレイアウトフォルダーの横に作成することを想像します。
hitch.united 2015

gradle 2.0.0とbuildToolsVersion 23.0.2で動作します!構成値はで'src/main/res/layouts/content'あり、この構成のパスは'src/main/res/layouts/content/layout'
cwhsu


2
しばらく運がなかったのですが、これが私にとって有効な唯一の解決策です。このような詳細な回答を画像で投稿していただきありがとうございます。
Machine Tribe

53

不可能ですが、レイアウトフォルダーは名前でソートされます。そこで、レイアウトファイル名の前にパッケージ名を追加します。たとえば、「buying」と「playing」の2つのパッケージの場合:

buying_bought_tracks.xml
buying_buy_tracks.xml
playing_edit_playlist.xml
playing_play_playlist.xml
playing_show_playlists.xml

20

私はAndroid StudioのAndroidファイルグループ化プラグインを使用しています。実際にはサブフォルダーを作成することはできませんが、ファイルとリソースを別のフォルダーにあるように表示できます。そして、これはまさに私が欲しかったものです。

「Android File Grouping」プラグインは次の方法でインストールできます

ウィンドウズ:

Android Studio-> File-> Settings-> Plugins。

マック:

Android Studio-> Android Studioタブ(左上)-> Preferences-> Plugins-> Install JetBrains Plugin ..

Macの場合はテストできましたが、プラグインを検索できませんでした。だから私はここからプラグインをダウンロードInstall plugin from diskし、上記の設定からオプションを使用しました。


そのプラグインのリンクも共有してください!
Paresh Mayani、2015

できました。>ファイル- - >設定- > [プラグインとにかく、あなたはいつものAndroid Studioの「グループ化Androidのファイル」を検索することができます
シャープ

3
プラグインは「Android」ビューでは機能せず、「Project」ビューでのみ機能しました:/
Hugo Gresse

18

Android StudioとGradleを使用すると、プロジェクトに複数のリソースフォルダーを作成できます。レイアウトファイルだけでなく、あらゆる種類のリソースを整理できます。

これはサブフォルダではありませんが、アプリケーションの一部を分離する場合があります。

設定は次のようになります:

sourceSets {
    main {
        res.srcDirs = ['src/main/res', 'src/main/res2']
    }
}

ドキュメントを確認してください。


2
この設定でレイアウトを変更するたびに、cleanアプリに反映するために常にa を実行する必要があることに気付きました。
Pawan Kumar

16

この問題の最もエレガントな解決策(サブフォルダーが許可されていない場合)は、ファイル名の先頭に、その中に配置したフォルダーの名前を付加することだと思います。たとえば、アクティビティ、フラグメント、または「場所」と呼ばれる一般的なビューのレイアウトがたくさんある場合は、それにplaces_my_layout_nameを追加するだけです。少なくともこれにより、IDE内で見つけやすくなるように整理する問題が解決されます。これは最も優れたソリューションではありませんが、何もないよりはましです。


16

小さな問題

この質問のトップアンサーに従うことで、サブフォルダーを実現できます。

ただし、プロジェクトが大きくなるにつれて、多くのサブフォルダーが作成されます。

sourceSets {
    main {
        res.srcDirs =
            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]
    }
}

大きな問題ではありませんが、

  • リストが非常に長くなるので、それはきれいではありません。
  • app/build.gradle新しいフォルダを追加するたびに変更する必要があります。

改善

そこで、ネストされたすべてのフォルダーを取得する簡単なGroovyメソッドを作成しました。

def getLayoutList(path) {
    File file = new File(path)
    def throwAway = file.path.split("/")[0]
    def newPath = file.path.substring(throwAway.length() + 1)
    def array = file.list().collect {
        "${newPath}/${it}"
    }
    array.push("src/main/res");
    return array
}

このメソッドをのandroid {...}ブロックの外側に貼り付けますapp/build.gradle


使い方

このような構造の場合:

<project root>
├── app <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

次のように使用します。

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("app/src/main/res/layouts/")
        }
    }
}

次のような構造がある場合:

<project root>
├── my_special_app_name <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

次のように使用します。

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("my_special_app_name/src/main/res/layouts/")
        }
    }
}

説明

getLayoutList()かかるa relative path引数として。relative pathプロジェクトのルートからの相対です。したがって、を入力すると"app/src/main/res/layouts/"、すべてのサブフォルダーの名前が配列として返されます。これは次とまったく同じです。

            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]

理解のためのコメント付きのスクリプトは次のとおりです。

def getLayoutList(path) {
    // let's say path = "app/src/main/res/layouts/
    File file = new File(path)

    def throwAway = file.path.split("/")[0]
    // throwAway = 'app'

    def newPath = file.path.substring(throwAway.length() + 1) // +1 is for '/'
    // newPath = src/main/res/layouts/

    def array = file.list().collect {
        // println "filename: ${it}" // uncomment for debugging
        "${newPath}/${it}"
    }

    array.push("src/main/res");
    // println "result: ${array}" // uncomment for debugging

    return array
}

それが役に立てば幸い!


私はあなたのアプローチを使用しましたが、活動でそれをどのように使用しますか?私はレイアウトでサブフォルダが管理者と呼ばれ、私は活動中だと使用した場合、それはadmin_homeレイアウトを持つフォルダを作成setContentView(R.layout.Admin.admin_home .)Admin.admin_homeが解決されていません
Asmaaラシャドを

のように、通常どおり使用できるはずR.layout.admin_homeです。スクリプトは自動的に名前を取得できるはずです。うまくいくかどうか教えてください。
私はカエルのドラゴンです。

それがうまく動作しますが、この行を変更した後array.push("src/main/res");def res="src/main/res"; array.push(res);、私はプッシュなどのエラーを持っているので、Gストリングパラメータを望んでいない文字列1、私はあなたがそれを編集することができ、このエラー見つかったのではなく、いずれか.IF
Asmaaラシャド

1
サブフォルダー内のレイアウトは、Android名前空間を解決できません。何か案は ?
ジャガー

これらの行のコメント// uncomment for debuggingを外して、出力src/main/res/layouts/<your_layout_files>が正しく検出されるかどうかを確認できますか?
私はカエルドラゴンです。

15

これで、「Android File Grouping」と呼ばれるJetBrainsプラグインで簡単に実行できます

このリンクをチェックしてください

Androidファイルのグループ化

ここに画像の説明を入力してください


単純な名前の規則でグループ化を編成するだけなので、正解としてマークする必要があります。アプリのgradleやデフォルトのディレクトリ構造を変更する必要はありません。すべてのレイアウトは引き続きレイアウトフォルダーに残りますが、グループ化されますAndroid Studio
Alireza Fattahi 2017

1
Androidビューでは機能しないため、受け入れられた答えにはならないはずです...(ただし、アイデアが気に入っています^^)
Appyx

これはAndroidの最後の最後のバージョンでは機能しません...更新されたバージョンはありますか?
user3053247

7

私がした方法は、プロジェクトの実際のresフォルダーと同じレベルに別のresフォルダーを作成することでした。これをアプリのbuild.gradleで使用できます。

android {
    //other stuff

    sourceSets {
        main.res.srcDirs = ['src/main/res', file('src/main/layouts').listFiles()]
    }
}

フォルダー構造の例

次に、新しいresフォルダーの各サブフォルダーは、特定の各画面またはアプリの何かに関連するものにすることができ、各フォルダーには独自のlayout/ drawable/ valuesなどがあり、これらを整理して、gradleファイルを手動で更新する必要がありません。回答が必要です(新しいリソースフォルダーを追加するたびにGradleを同期してそれを認識し、xmlファイルを追加する前に関連するサブフォルダーを追加してください)。



3

LinuxまたはMacボックスで開発している場合の回避策は、レイアウトファイルへのシンボリックリンクを含むサブフォルダーを作成することです。-sを指定してlnコマンドを使用するだけです

ln -s PATH_TO_YOUR_FILE

この問題は、Layoutフォルダーにすべての.xmlファイルが含まれていることです。ただし、サブフォルダを使用してそれらを選択することもできます。それはあなたが望むものに最も近いものです。

私が読んだところ、Vista以降を使用している場合、これはWindowsでも機能する可能性があります。このmklinkコマンドがあります。ただググって、自分で使ったことがない。

別の問題は、ファイルを開いてプラグインから再度開こうとすると、NULLポインター例外がスローされることです。しかし、それはハングアップしません。


1
シンボリックリンクを配置すると、コンポーネントを異なるサブディレクトリに分離してストレージをモジュール化したいという目的が無効になります。事実上、複雑にするのではなく、複雑にすることができます。Gradleでは、追加のリソースディレクトリを指定できます。
RichieHH 2014年

3

複数のリソースセットの提案はすべて機能する可能性がありますが、問題は、Android Studio Gradleプラグインの現在のロジックが、ネストされたリソースセットの変更後にリソースファイルを更新しないことです。現在の実装は、startsWith()を使用してリソースディレクトリをチェックしようとするため、ネストされたディレクトリ構造(つまり、src / main / res / layout / layoutsおよびsrc / main / res / layout / layouts_category2)はsrc / main / resを選択します/ layout / layoutsは一貫しており、実際に変更を更新することはありません。その結果、毎回プロジェクトを再ビルド/クリーンアップする必要があります。

問題の解決に役立つように、https://android-review.googlesource.com/#/c/157971/でパッチを提出しました。


ASはXMLファイルの変更に注意しないことに同意します。しかし、解決策は何ですか?stackoverflow.com/questions/32317822/…を試します。
CoolMind 2018

3

@eskiによるトップの回答は良いですが、コードを使用するのはエレガントではないため、一般的な使用のために、gradleでグルーヴィーなスクリプトを作成しました。これはすべてのビルドタイプと製品フレーバーに適用され、レイアウトに使用できるだけでなく、ドローアブルなどの他のリソースタイプのサブフォルダーを追加することもできます。ここにコードがあります(androidプロジェクトレベルのgradleファイルのブロックに入れてください):

sourceSets.each {
    def rootResDir = it.res.srcDirs[0]
    def getSubDirs = { dirName ->
        def layoutsDir = new File(rootResDir, dirName)
        def subLayoutDirs = []
        if (layoutsDir.exists()) {
            layoutsDir.eachDir {
                subLayoutDirs.add it
            }
        }
        return subLayoutDirs
    }
    def resDirs = [
            "anims",
            "colors",
            "drawables",
            "drawables-hdpi",
            "drawables-mdpi",
            "drawables-xhdpi",
            "drawables-xxhdpi",
            "layouts",
            "valuess",
    ]
    def srcDirs = resDirs.collect {
        getSubDirs(it)
    }
    it.res.srcDirs = [srcDirs, rootResDir]
}

実際にどのように行うのですか?

たとえば、という名前のサブフォルダを作成activitylayoutresDirsなどの変数に任意の名前で文字列を追加したいlayouts場合、レイアウトxmlファイルをに配置する必要がありますres\layouts\activity\layout\xxx.xml

という名前のサブフォルダを作成したい場合selectorsdrawableresDirsなどの変数に任意の名前で文字列を追加しdrawables、ドローアブルxmlファイルをに配置する必要がありますres\drawables\selectors\drawable\xxx.xml

このようなフォルダ名layoutsdrawablesで定義されているresDirs変数は、それが任意の文字列を指定できます。activityまたはなど、ユーザーselectorsが作成したすべてのサブフォルダーは、フォルダーと同じと見なされresます。したがって、selectorsフォルダーでは、drawableフォルダーを追加で作成し、xmlファイルをdrawableフォルダーに配置する必要があります。その後、gradleは、xmlファイルを通常のドローアブルとして認識できます。


これは正解と考えるべきです!シンプルで完璧に機能します!
GláucioレオナルドSant'ana

2

承認済みの回答でメソッドを使用していて、少し改善したい場合は、gradle設定を次のように変更します。

    sourceSets {
    main {
        res.srcDirs = [
            file("src/main/res/layouts/").listFiles(),
            "src/main/res/layouts",
            "src/main/res"
        ]
    }
}

したがって、さらにフォルダーとレイアウトを追加する場合、ここに戻ってソースフォルダーの長いリストを追加する必要はありません。gradleですべてのフォルダーを取得してください。


1
  • ステップ1:レイアウトを右クリック-エクスプローラーに表示
  • 手順2:レイアウトフォルダーを開き、サブフォルダーを直接作成します:layout_1、layout_2 ...
  • ステップ3:layout_1を開いてフォルダーレイアウトを作成(注:必須の名前はlayout)、layout_2フォルダーを開いてレイアウトサブディレクトリを作成(注:必須の名前はlayout)...
  • ステップ4:xmlファイルをlayout_1およびlayout_2のレイアウトサブディレクトリにコピーします
  • ステップ5:buid.grade(モジュールアプリ)でコードを実行し、今すぐ同期を実行します。

sourceSets {
    main {
        res.srcDirs =
            [
                'src / main / res / layout / layout_1'
                'src / main / res / layout / layout_2',
                'src / main / res'
            ]
    }
}
  • ステップ6:概要:上記のすべてのステップは、フォルダーをクラスター化して「プロジェクト」モードで表示する場合にのみ役立ちますが、「Android」モードは通常どおり表示されます。
  • だから私は多分接頭辞に名前を付けることはフォルダをクラスタ化するのと同じくらい効果的であると描きます。

Projectモードをありがとう。サブフォルダが(Androidモードで)どこに消えたのか理解できませんでした。
CoolMind 2018

0

まあ、短い答えはノーです。しかし、間違いなく複数のresフォルダを持つことができます。これは、layoutフォルダのサブフォルダを作成するのと同じくらい近いと思います。方法は次とおりです。


1
受け入れられた回答を確認してください。私は個人的には試していませんが、確認して更新できれば役に立ちます。
Paresh Mayani

0

上位の回答にはいくつかの欠点があります。新しいレイアウトパスを追加する必要がありres\layoutsます。ASは新しいリソースをの代わりにフォルダーに配置しますres\values

私が同様に書いたいくつかの答えを組み合わせて:

sourceSets {
    main {
        res.srcDirs =
                [
                        'src/main/res',
                        file("src/main/res/layouts/").listFiles(),
                        'src/main/res/layouts'
                ]
    }
}

この記事でフォルダーを作成しました:http : //alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/。サブフォルダを作成するには、次のメニューを使用する必要があります:新規>フォルダ> Resフォルダ。

更新

数週間後、リソースの変更がAndroid Studioで認識されないことがわかりました。したがって、いくつかの奇妙なバグが表示されます。たとえば、レイアウトには引き続き古いサイズとマージンが表示されます。ASが新しいXMLファイルを見つけられない場合があります(特に実行時)。ときどき、view ids(別のXMLファイルへの参照)が混在しています。Build > Clean Projectまたはを押す必要があることがよくありBuild > Rebuild Projectます。Android Studioでxmlレイアウトファイルを変更した後に必要な再構築ご覧ください。


あなたのコメント「この記事(添付リンク)でフォルダを作成しました」は、ここでソリューションを提供するための受け入れられる方法ではありません。そのため、答えは曖昧です。指示を残して、リンクを作成者にクレジットすることができます。そうでなければ、これは単に怠惰です。
jungledev 2018

@jungledev、まあ、resASはリソースをフォルダーに分割することを完全にはサポートしていないので、最後にこのアイデアを拒否して従来のフォルダーに戻りました。おそらく私はこの答えを変更するか、削除することさえします。しかし、ここでソリューションを提供することは受け入れられない方法だと言ったとき、どういう意味ですか?
CoolMind 2018

まさに私が言ったことを意味します。「このチュートリアルでやったことは...(リンクを挿入)」と言ってはいけません。あなたが言うべきことは次のとおりです:「私はこのチュートリアル(リンクを挿入)に従いました、そしてここに私のために働いたステップがあります。ステップ1、ステップ2、ステップ3 ...など」答えにここにステップを含める必要があります。チュートリアルへのリンクは
許可され

0

(簡単に)サブディレクトリを作成することはできませんが、追加のリソースフォルダーを作成することはできます。驚いたことはありませんが、デフォルトのリソースフォルダー維持し、さらにいくつか追加します。

    sourceSets {
        main.res.srcDirs += ['src/main/java/XYZ/ABC']
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.