質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • C#

    5962questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1548questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Xamarin

    423questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Resourceに定義がありませんとエラーが起きる

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 729

mercurian-teto

score 40

xamarin初心者です。C#はそこそこやったことがあります。
このサイトを参考にプログラムを作っていきました。
しかし、上のサイトにあるように
MainActivity.csを記述してからコンパイルしようとすると

Button btnM = FindViewById<Button>(Resource.Id.btnSayHello);
TextView txtV = FindViewById<TextView>(Resource.Id.txtMsg);


の箇所に対して

resourceにIDの定義がありません
また
No resource type specified (at 'id' with value '@+txtMsg').    
とエラーが発生します。
上のサイトを見てみてもIDの定義を記述するといった手順を踏んでいません。

Resource.Designer.csに何か記述するかと推測されるのですが、
何を書けばいいのかさっぱりわかりません。
どうすればエラーが解けるか回答お願いします。

追記1
MainActivity.csのコードです。

using Android.App;
using Android.Widget;
using Android.OS;

namespace anti_offtime
{
    [Activity(Label = "DroidSample", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            Button btnM = FindViewById<Button>(Resource.Id.btnSayHello);
            TextView txtV = FindViewById<TextView>(Resource.Id.txtMsg);

            btnM.Click += delegate
            {
                txtV.Text = "こんにちは";
            };
        }
    }
}


追記2
Main.axml

<?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">
    <Button
        android:text="btnSayHello"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnSayHello" />
    <TextView
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+txtMsg" />
    <TextView
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textMsg" />
</LinearLayout>

追記3

上のプログラムがなぜか起動できなくなったので再度作り直しました。
コードは以下に示します。
Main.axml

<?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">
    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnSayHello" />
    <TextView
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtMsg" />
</LinearLayout>

MainActivity.cs

using Android.App;
using Android.Widget;
using Android.OS;

namespace anti_offtime
{
    [Activity(Label = "offtimekiller", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            Button btnM = FindViewById<Button>(Resource.Id.btnSayHello);
            TextView txtV = FindViewById<TextView>(Resource.Id.txtMsg);

            btnM.Click += delegate
            {
                txtV.Text = "こんにちは";
            };
        }
    }
}


エラーが

// Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            Button btnM = FindViewById<Button>(Resource.Id.btnSayHello);
            TextView txtV = FindViewById<TextView>(Resource.Id.txtMsg);


これらのコードに対して現在のコンテキストにresourceという名前は存在しません

追記4再度作り直しました

MainActivity.cs

using Android.App;
using Android.Widget;
using Android.OS;

namespace App5
{
    [Activity(Label = "DroidSample", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            Button btnM = FindViewById<Button>(Resource.Id.btnSayHello);
            TextView txtV = FindViewById<TextView>(Resource.Id.txtMsg);

            btnM.Click += delegate
            {
                txtV.Text = "こんにちは";
            };
        }
    }
}


Main.axml

<?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">
    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnSayHello" />
    <TextView
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtMsg" />
</LinearLayout>


Resource.Designer.cs

も追記しておきました

#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
//     このコードはツールによって生成されました。
//     ランタイム バージョン:4.0.30319.42000
//
//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
//     コードが再生成されるときに損失したりします。
// </auto-generated>
//------------------------------------------------------------------------------

[assembly: global::Android.Runtime.ResourceDesignerAttribute("App5.Resource", IsApplication=true)]

namespace App5
{


    [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
    public partial class Resource
    {

        static Resource()
        {
            global::Android.Runtime.ResourceIdManager.UpdateIdValues();
        }

        public static void UpdateIdValues()
        {
        }

        public partial class Attribute
        {

            static Attribute()
            {
                global::Android.Runtime.ResourceIdManager.UpdateIdValues();
            }

            private Attribute()
            {
            }
        }

        public partial class Layout
        {

            // aapt resource value: 0x7f020000
            public const int Main = 2130837504;

            static Layout()
            {
                global::Android.Runtime.ResourceIdManager.UpdateIdValues();
            }

            private Layout()
            {
            }
        }

        public partial class String
        {

            // aapt resource value: 0x7f030000
            public const int app_name = 2130903040;

            static String()
            {
                global::Android.Runtime.ResourceIdManager.UpdateIdValues();
            }

            private String()
            {
            }
        }
    }
}
#pragma warning restore 1591
Button btnM = FindViewById<Button>(Resource.Id.btnSayHello);
            TextView txtV = FindViewById<TextView>(Resource.Id.txtMsg);


にたいして ResouceにIDの定義がありませんと出てきます

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2017/12/25 12:35

    挙げられた URL の冒頭ではプロパティウィンドウから Id にアクセスしていますが、これはできるのですか?

    キャンセル

回答 3

checkベストアンサー

+1

こんにちは。田淵です。

Xamarin の質問をするときには、Xamarin.Forms なのか、Xamarin ネイティブ(Xamarin.iOS/Xamarin.Android)なのか、Xamarin ネイティブの場合は Android なのか iOS なのかを明記するとより的確な回答が得られると思います。

今回は Xamarin.Android のようですね。

FindViewById メソッドを使用するのは、Activity から UI コントロールを使えるようにするためです。
逆に言うと、UI コントロールを定義して、それを使うために FindViewById します。
今回は Resource がない。というエラーなので、「UI コントロールを用意していない」のではないかと推測します。(axml の記述も質問中に出てきていないので)

まず、Resources\layout\Main.axml を開き、Button と TextView を配置して、それぞれに btnSayHellotxtMsg と名前を付けてください。

XML なので直接記述することもできますが、Java や Kotlin での Android ネイティブ開発に慣れていない場合は、デザイナーで配置するのが簡単だと思います。

デザイナーのイメージは例えば Visual Studio 2017 の場合は以下のような感じでコントロールを配置して右下の「プロパティ」ウィンドウの「id」を設定するだけです。

Android デザイナー

XML で直接記述する場合は例えば次のようになるかと思います。

<!-- ...何らかのレイアウト内... -->
<Button android:id="@+id/btnSayHello" 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Say Hello" />
<TextView android:id="@+id/txtMsg"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="" />

なお、デザイナーまたは XML で画面を作成すると、Resource.Designer.cs は Visual Studio が自動的に再生成してくれますので、中を手動で編集してはいけませんので、ご注意ください。

一助になれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/25 00:10

    回答ありがとうございます。
    Resources\layout\Main.axml を開き、Button と TextView を配置して、それぞれに btnSayHello、txtMsg と名前を付けてください。
    としたのですが、
    追記3のようになってしまいます。

    キャンセル

  • 2017/12/25 02:52

    すいません追記4をご覧ください

    キャンセル

  • 2017/12/25 09:12

    Resource.Designer.cs にまだコントロールの ID が追加されていないですね。

    Resource.Designer.cs はビルド時に自動生成されます。(ビルド前に生成されることもあるみたいですが、ビルド時は確実に生成されます。)
    Activiry.cs の FindViewById のコードを一度コメントにして、Main.axml にコントロールを追加した時点で一度ビルドすると、Resource.Designer.cs が確実に追加されると思います。その後コメントを解除してビルドすると恐らく大丈夫かと思います。

    または、Resource.Designer.cs を手動で編集したり変な感じになっている可能性があるので、Resource.Designer.cs を一度削除して、Visual Studio を再起動して、Activity に FindViewById がない状態でビルドするのも良い回避策のはずです。

    一度ビルドが通れば後はそんなに神経質にならなくても大体ビルドは通るはずです。

    頑張ってください。

    キャンセル

  • 2017/12/25 16:18

    一からやり直してみたらなぜかコンパイルが通り普通に実行できるようになりました。不完全なままデバグを実行してからもう一度編集を加えデバグしたからかもしれないのですが、とりあえず回答してくださった方々がおっしゃるようにresource.designer.csにコントロールIDが追加されていなかったのが原因でした。お騒がせして申し訳ありませんでした。

    キャンセル

  • 2017/12/25 16:21

    これからのアプリ開発でもResource.Designer.csの自動生成についてのアドバイスも参考にしていただきます。

    キャンセル

0

using を見直してみてください。Resource が別のクラスを指してはいませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/24 08:15 編集

    あと Designer.cs という名前のついたファイルは基本的に書き換えてはいけません。デザイナーによって自動的に作成・更新されるものなので上書きされる可能性があります。

    キャンセル

  • 2017/12/24 13:04

    MainActivity.csに
    using Android.App;
    using Android.Widget;
    using Android.OS;
    とありますが、ここにresourceに関係するusing ディレクティブが足りないということでしょうか。

    キャンセル

  • 2017/12/25 16:19

    前のプログラムを見ると、Resource.Designer.cs クラス内に Idクラスは生成されていませんでした。とりあえず、新しく作りなおしたら自己解決しました。お騒がせして申し訳ありませんでした。

    キャンセル

0

こんにちは。

Main.axml でエラーは発生していないですか?
Resource.Designer.cs クラス内に Idクラスは生成されてますか?

念のためMain.axmlも提示してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/25 00:11

    回答ありがとうございます。
    追記3に示しました。

    キャンセル

  • 2017/12/25 00:48

    IDがないのではなく、Resourceが無いって言われてるのですか?
    Xamarin.Androidの空のテンプレートを新規作成し、ビルドできるか確認してみては。開発環境がそもそも準備できていない可能性はないですかね。

    キャンセル

  • 2017/12/25 02:50

    もう一度試すとなぜかエラーが変更して追記4のようになっています。
    Resource.Designer.cs クラス内に Idクラスが内容ですが、これが原因ですか。

    キャンセル

  • 2017/12/25 16:19

    前のプログラムを見ると、Resource.Designer.cs クラス内に Idクラスは生成されていませんでした。とりあえず、新しく作りなおしたら自己解決しました。お騒がせして申し訳ありませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5962questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1548questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Xamarin

    423questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。