XAMARIN: как найтиViewById <TabWidget> ??? (Ресурс не найден)

Когда я пытаюсь сделать это, я получаю сообщение об ошибке "Ресурс не найден":

    TabWidget tabz = FindViewById<TabWidget>(Resource.Id.tabs);

компилятор не видит TabWidget, даже если он явно помечен идентификатором в моем файле Main.axml

Ошибка CS0117 "Resource.Id" не содержит определения для "вкладок"

Вот мой полный код:

<LinearLayout
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:padding = "5dp">
<TabWidget
    android:id = "@android:id/tabs"
    android:layout_width = "fill_parent"
    android:layout_height = "wrap_content"
    android:visibility = "visible" />
<FrameLayout
    android:id = "@android:id/tabcontent"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    android:padding = "5dp" />
</LinearLayout>

ИЗМЕНИТЬ, извините, это полный код ... Я не знаю, почему я не скопировал его в прошлый раз. В приведенном выше примере отсутствует TabHost

<?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">
    <TabHost
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:minWidth = "25px"
        android:minHeight = "25px"
        android:id = "@+id/tabHost1">
        <LinearLayout
            android:layout_width = "match_parent"
            android:layout_height = "match_parent"
            android:orientation = "vertical"
            android:id = "@+id/linearLayout1">
            <TabWidget
                android:id = "@android:id/tabs"
                android:layout_width = "match_parent"
                android:layout_height = "wrap_content" />
            <FrameLayout
                android:id = "@android:id/tabcontent"
                android:layout_width = "match_parent"
                android:layout_height = "match_parent" />
        </LinearLayout>
    </TabHost>

</LinearLayout>

Как заставить компилятор распознавать идентификатор моей вкладки? Я пробовал перестроить resource.designer.cs .. помещая объявление TabWidget во все действия ... ничего не работает. Мой C# не видит TabWidget

полный проект можно найти здесь:

https://github.com/hexag0d/BitChute_Mobile_Android_a2

Я тоже пробовал это, и это не сработало Файл ресурсов Xamarin Android не найден

заранее спасибо

проблема в файле ResourceDesigner.cs, просто прокомментируйте этот TabWidget tabz = FindViewById<TabWidget>(Resource.Id.tabs); и перестройте свое решение, и оно должно начать работать правильно, если не вернуться

FreakyAli 30.10.2018 12:21

@ G.hakim lol, если я это прокомментирую, то мой TabWidget не будет доступен ...

hexagod 30.10.2018 23:44

@hexagodНе думаю, вы поняли, о чем я говорю, просто посмотрите мой ответ ниже

FreakyAli 31.10.2018 07:27
0
3
1 320
2

Ответы 2

О вопросах в вашем комментарии:

1,

that is very good advice, but one note is that when SetContentView(localLayout); is used inside an activity that already has a content view, it crashes the app.

Приложение упало, потому что localLayout в SetContentView (localLayout) является LinearLayout, а для TabWidget нужен TabHost. Таким образом, вы можете напрямую использовать:

SetContentView(Resource.Layout.Main);

где Main.xaml похож на:

<?xml version = "1.0" encoding = "utf-8"?>

<TabHost xmlns:android = "http://schemas.android.com/apk/res/android"
    android:id = "@android:id/tabhost"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    android:theme = "@style/MyTheme">

   <LinearLayout
    android:orientation = "vertical"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    android:padding = "5dp">

    <TabWidget
        android:id = "@android:id/tabs"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:layout_weight = "0.0"
        android:visibility = "visible" />
    <FrameLayout
        android:id = "@android:id/tabcontent"
        android:layout_width = "fill_parent"
        android:layout_height = "fill_parent"
        android:padding = "5dp" />
    </LinearLayout>
</TabHost>

2,

LinearLayout localLayout = FindViewById(Resource.Layout.Main); View whichYouWantToUse_findViewById = LayoutInflater.Inflate(Resource.Layout.Main, null); TextView tv = FindViewById(Resource.Id.textView169); TabHost _tabHost = (TabHost)whichYouWantToUse_findViewById.FindViewById(Resource.Id.tabhost); ' still can't see the tabhost ... I'm losing my mind here

Причина, по которой вы не видите tabhost, состоит в том, что, во-первых, TabHost - это FrameLayout, а не LinearLayout, во-вторых, Resource.Id.tabhost должен быть Android.Resource.Id.TabHost. Итак, я отредактировал ваш код так:

    FrameLayout localLayout = FindViewById<FrameLayout>(Resource.Layout.Main);
    whichYouWantToUse_findViewById = LayoutInflater.Inflate(Resource.Layout.Main, null);
    //TextView tv = FindViewById<TextView>(Resource.Id.textView1);
    TabHost _tabHost = (TabHost)whichYouWantToUse_findViewById.FindViewById(Android.Resource.Id.TabHost);

3,

So the interesting thing is if I change tabhost to tahost ala android:id = "@+id/tahost" the resource appears in the designer but when I change to android:id = "@+id/tabhost" the resource disappears.. very strange..

Идентификатор TabHost всегда должен быть @android: id / tabhost ", его нельзя изменить на tahost или любой другой.

Итак, код в методе onCreat выглядит следующим образом:

    base.OnCreate(bundle);

    SetContentView(Resource.Layout.Main);
    View whichYouWantToUse_findViewById = LayoutInflater.Inflate(Resource.Layout.layout1, null);
    TextView textInAnotherLayout = (TextView)whichYouWantToUse_findViewById.FindViewById(Resource.Id.textView1);
    textInAnotherLayout.Text = "Yeah";

    TabHost tabHost = FindViewById<TabHost>(Android.Resource.Id.TabHost);
    TabWidget tabWidget = tabHost.TabWidget;
    var tabContent = tabHost.TabContentView;

    FrameLayout localLayout = FindViewById<FrameLayout>(Resource.Layout.Main);
    whichYouWantToUse_findViewById = LayoutInflater.Inflate(Resource.Layout.Main, null);
    TabHost _tabHost = (TabHost)whichYouWantToUse_findViewById.FindViewById(Android.Resource.Id.TabHost);

Вот старый ответ.


Answer modified: The way to get TabHost and TabWidget in Activity:

TabHost tabHost = this.TabHost;
TabWidget tabWidget = tabHost.TabWidget;

The way to use one resource from one XAML file in the activity for another:

    LinearLayout localLayout = FindViewById<LinearLayout>(Resource.Layout.Main);
    SetContentView(localLayout);
    View whichYouWantToUse_findViewById = LayoutInflater.Inflate(Resource.Layout.layout1, null);
    Button button1 = (Button)whichYouWantToUse_findViewById.FindViewById(Resource.Id.button1);

I download your project and fixed this problem by modifying the property of >android:id

это было как дела !! Я проверю его сегодня вечером, когда вернусь домой. спасибо плейбой

hexagod 30.10.2018 21:17

как мне заставить это работать с TabHost? com.android.layoutlib.bridge.impl.RenderSessionImpl $ PostInfl‌ ateException: TabHost требует TabWidget с идентификатором "android: id / tabs"

hexagod 31.10.2018 16:18

После исследования вашей проблемы я обнаружил, что TabWidget - это специальный макет в android, вы не можете изменить идентификатор, и вам нужно получить виджет с помощью (tabHost.TabWidget) в вашем коде C#. Сейчас я изменю свой ответ и прошу прощения за неправильный ответ.

AbbyWang - MSFT 01.11.2018 03:51

не беспокойся ... спасибо, чувак. Мы все здесь учимся. Оцените помощь, мой чувак

hexagod 01.11.2018 15:09

. теперь я просто пытаюсь понять, как использовать один ресурс из одного файла XAML в действии для другого. Я думаю, мне нужно использовать представление инфляции? Не ожидая, что вы сделаете мою работу ... Я отправлю ответ, как только узнаю

hexagod 01.11.2018 21:57

Я изменил ответ, а также написал пример кода для использования одного ресурса из одного файла XAML в действии для другого.

AbbyWang - MSFT 02.11.2018 04:33

мой код по-прежнему не видит ресурс «вкладок» или «хост табуляции» внутри действия ... Resource.Id не содержит определения вкладок Resource.Id не содержит определения для хоста вкладок, когда я помещаю его в действие, но У меня есть определения ресурсов, когда я использую это внутри MainActivity ... поэтому я могу перейти MainActivity >> Activity resource, но не Activity >> MainActivity tabhost или вкладки ... странно, все еще работаю над этим.

hexagod 02.11.2018 17:38

это очень хороший совет, но одно замечание: когда SetContentView (localLayout); используется внутри действия, которое уже имеет представление содержимого, оно приводит к сбою приложения.

hexagod 02.11.2018 18:23

'LinearLayout localLayout = FindViewById <LinearLayout> (Resource.Layout.Main); Просмотр whichYouWantToUse_findViewById = LayoutInflater.Inflate (Resource.Layout.Main, null); TextView tv = FindViewById <TextView> (Resource.Id.textView169); TabHost _tabHost = (TabHost) whichYouWantToUse_findViewById.FindViewById (Resourc‌ e.Id.tabhost); 'все еще не вижу табхоста ... Я схожу с ума здесь

hexagod 02.11.2018 18:28

Интересно то, что если я изменю tabhost на tahost ala android: id = "@ + id / tahost", ресурс появится в дизайнере, но когда я перейду на android: id = "@ + id / tabhost", ресурс исчезнет .. очень странно .. Попробую вручную добавить в resource.designer.cs

hexagod 02.11.2018 20:34

Я устанавливаю свойство просто: TabHost tabHost; tabHost.TabWidget.Visibility = Android.Views.ViewStates.Gone; внутри OnClick щелкните прослушиватель github.com/hexag0d/BitChute_Mobile_Android_a2/blob/2.762/…, и он сработал ... но все еще нет ссылки на объект для tabhost при использовании умного метода, который вы мне предоставили внутри моих классов Activity, возможно, это связано с тем, что свойства tabhost доступны только внутри самого tabhost? Я все еще работаю над этим ... очень признателен за совет, который вы мне дали по поводу раздувания просмотров.

hexagod 03.11.2018 02:58

Вчера я изменил свой ответ в соответствии с вашими вопросами в вашем комментарии, но не могу добавить этот комментарий. Пожалуйста, обратитесь к измененному ответу, и я думаю, что он решит ваши проблемы и затруднения.

AbbyWang - MSFT 06.11.2018 02:28

Проблема не в компиляторе Visual Studio, а в том, как вы объявили идентификатор для своего представления,

Если вы посмотрите блог Джеймса Уайта это, вы увидите, как Id и атрибуты Layout действительно работают в Android,

Правильный способ объявления Id - это что-то вроде этого android:id = "@+id/tabs", тогда как то, что вы делаете, - это android:id = "@android:id/tabs".

Следовательно, когда вы добавляете их и пытаетесь найти его с помощью Resource.Id.tabs, в идентификаторе на вкладках имени нет ничего, поскольку он никогда не добавлялся файлом Xamarin ResourceDesginer.cs.

Итак, конечный результат должен быть примерно таким:

  <TabHost
    android:id = "@+id/tabhost"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:layout_alignParentTop = "true"
    android:layout_centerHorizontal = "true">

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

        <TabWidget
            android:id = "@android:id/tabs"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"></TabWidget>

        <FrameLayout
            android:id = "@android:id/tabcontent"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent">

            <LinearLayout
                android:id = "@+id/tab1"
                android:layout_width = "match_parent"
                android:layout_height = "match_parent"
                android:background = "#ffc916"
                android:orientation = "vertical">
        </LinearLayout>
        </FrameLayout>
    </LinearLayout>
  </TabHost>

Также обратите внимание, что я заменил все fill_parent на match_parent, причина в том, что родительский элемент заполнения теперь устарел или вы можете сказать, что он заменен (после API-8) и, следовательно, не должен использоваться, что можно найти здесь.

Обновлять:

Я обновил способ работы хоста вкладок, также обновил приведенный выше XML, и я добавляю ссылка на ссылку, где вы можете найти правильный способ использования TabHost и TabWidget, а также хороший пример ТАК для того же.

mono.android.DesignerException: com.android.layoutlib.bridge.impl.RenderSessionImpl $ PostInfl‌ ateException в mono.android.DesignerException.fromThrowable (DesignerExcepti‌ on.java:54) в mono.android.DesignerSessionImpl $ PostInfl .java: 235) в mono.android.DesignerSession.load (DesignerSession.java:314) в mono.android.MessageListener $ Runner.run (MessageListener.java‌: 44) в java.lang.Thread.run (Thread.java : 748) Вызвано: com.android.layoutlib.bridge.impl.RenderSessionImpl $ PostInfl‌ ateException: TabHost требует TabWidget с идентификатором "android: id / tabs".

hexagod 31.10.2018 15:51

.. по какой-то причине, когда я скопировал свой код, он пропустил TabHost. Я обновил его, чтобы отразить мой TabHost ... и я получаю указанное выше исключение

hexagod 31.10.2018 16:13

спасибо за помощь, ребята ... настоящая проблема в том, что я не могу использовать ресурсы из разных файлов XAML без использования того, что, как я уверен, должно быть инфлятором представления. Сейчас я пытаюсь проработать детали. Я отправлю полный ответ, как только разберусь.

hexagod 01.11.2018 21:31

К вашему сведению, tabhost должен выглядеть так, иначе приложение вылетает. <TabHost android: id = "@ android: id / tabhost" ^^^ вставьте это в мой блок кода

hexagod 01.11.2018 22:26

Я уже сделал это, взгляните, а также обновил код

FreakyAli 02.11.2018 07:05

Нет, tabhost буквально должен называться tabhost, а не tabHost, иначе возникнет это исключение Java.Lang.RuntimeException: ваш контент должен иметь TabHost, атрибут id которого равен 'android.R.id.tabhost'

hexagod 02.11.2018 18:44

Хорошо, что бы я ни использовал это в любом случае, это просто устарело, теперь вы все равно используете пейджеры. И хорошо, обновив его до tabhost

FreakyAli 02.11.2018 20:00

да, лол .. Я тебя не виню. Спасибо за попытку. Я даже не думаю, что это возможно. Я так далеко в проекте, и tabhost работает нормально ... производительность лучше, чем viewpager. Кто-то другой сделал версию моего приложения с viewpager, и производительность не так хороша, как у actionbar.tabhost ... Я все равно ценю помощь G.hakim

hexagod 02.11.2018 21:31

Ладно, в любом случае, я изучу эту вещь позже, может быть, в любом случае спасибо за ваше время, а также нужно узнать что-то новое для изменений \

FreakyAli 05.11.2018 06:08

эээ нет ... спасибо, сэр. Вы помогаете мне с моей проблемой. =] .. Я все еще над этим работаю. Это маленький хитрый педераст. Я думаю, что мы можем ссылаться на tabhost только изнутри tabhost. Любая попытка установить параметр хоста табуляции в действии терпит неудачу. Я получил ссылку на работу, когда действие изменяет свойство tabhost ... так, например, onclick of tab скрывает tabhost

hexagod 07.11.2018 19:00

Другие вопросы по теме