Когда я пытаюсь сделать это, я получаю сообщение об ошибке "Ресурс не найден":
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 не найден
заранее спасибо
@ G.hakim lol, если я это прокомментирую, то мой TabWidget не будет доступен ...
@hexagodНе думаю, вы поняли, о чем я говорю, просто посмотрите мой ответ ниже
О вопросах в вашем комментарии:
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
это было как дела !! Я проверю его сегодня вечером, когда вернусь домой. спасибо плейбой
как мне заставить это работать с TabHost? com.android.layoutlib.bridge.impl.RenderSessionImpl $ PostInfl ateException: TabHost требует TabWidget с идентификатором "android: id / tabs"
После исследования вашей проблемы я обнаружил, что TabWidget - это специальный макет в android, вы не можете изменить идентификатор, и вам нужно получить виджет с помощью (tabHost.TabWidget) в вашем коде C#. Сейчас я изменю свой ответ и прошу прощения за неправильный ответ.
не беспокойся ... спасибо, чувак. Мы все здесь учимся. Оцените помощь, мой чувак
. теперь я просто пытаюсь понять, как использовать один ресурс из одного файла XAML в действии для другого. Я думаю, мне нужно использовать представление инфляции? Не ожидая, что вы сделаете мою работу ... Я отправлю ответ, как только узнаю
Я изменил ответ, а также написал пример кода для использования одного ресурса из одного файла XAML в действии для другого.
мой код по-прежнему не видит ресурс «вкладок» или «хост табуляции» внутри действия ... Resource.Id не содержит определения вкладок Resource.Id не содержит определения для хоста вкладок, когда я помещаю его в действие, но У меня есть определения ресурсов, когда я использую это внутри MainActivity ... поэтому я могу перейти MainActivity >> Activity resource, но не Activity >> MainActivity tabhost или вкладки ... странно, все еще работаю над этим.
это очень хороший совет, но одно замечание: когда SetContentView (localLayout); используется внутри действия, которое уже имеет представление содержимого, оно приводит к сбою приложения.
'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); 'все еще не вижу табхоста ... Я схожу с ума здесь
Интересно то, что если я изменю tabhost на tahost ala android: id = "@ + id / tahost", ресурс появится в дизайнере, но когда я перейду на android: id = "@ + id / tabhost", ресурс исчезнет .. очень странно .. Попробую вручную добавить в resource.designer.cs
Я устанавливаю свойство просто: TabHost tabHost; tabHost.TabWidget.Visibility = Android.Views.ViewStates.Gone; внутри OnClick щелкните прослушиватель github.com/hexag0d/BitChute_Mobile_Android_a2/blob/2.762/…, и он сработал ... но все еще нет ссылки на объект для tabhost при использовании умного метода, который вы мне предоставили внутри моих классов Activity, возможно, это связано с тем, что свойства tabhost доступны только внутри самого tabhost? Я все еще работаю над этим ... очень признателен за совет, который вы мне дали по поводу раздувания просмотров.
Вчера я изменил свой ответ в соответствии с вашими вопросами в вашем комментарии, но не могу добавить этот комментарий. Пожалуйста, обратитесь к измененному ответу, и я думаю, что он решит ваши проблемы и затруднения.
Проблема не в компиляторе 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".
.. по какой-то причине, когда я скопировал свой код, он пропустил TabHost. Я обновил его, чтобы отразить мой TabHost ... и я получаю указанное выше исключение
спасибо за помощь, ребята ... настоящая проблема в том, что я не могу использовать ресурсы из разных файлов XAML без использования того, что, как я уверен, должно быть инфлятором представления. Сейчас я пытаюсь проработать детали. Я отправлю полный ответ, как только разберусь.
К вашему сведению, tabhost должен выглядеть так, иначе приложение вылетает. <TabHost android: id = "@ android: id / tabhost" ^^^ вставьте это в мой блок кода
Я уже сделал это, взгляните, а также обновил код
Нет, tabhost буквально должен называться tabhost, а не tabHost, иначе возникнет это исключение Java.Lang.RuntimeException: ваш контент должен иметь TabHost, атрибут id которого равен 'android.R.id.tabhost'
Хорошо, что бы я ни использовал это в любом случае, это просто устарело, теперь вы все равно используете пейджеры. И хорошо, обновив его до tabhost
да, лол .. Я тебя не виню. Спасибо за попытку. Я даже не думаю, что это возможно. Я так далеко в проекте, и tabhost работает нормально ... производительность лучше, чем viewpager. Кто-то другой сделал версию моего приложения с viewpager, и производительность не так хороша, как у actionbar.tabhost ... Я все равно ценю помощь G.hakim
Ладно, в любом случае, я изучу эту вещь позже, может быть, в любом случае спасибо за ваше время, а также нужно узнать что-то новое для изменений \
эээ нет ... спасибо, сэр. Вы помогаете мне с моей проблемой. =] .. Я все еще над этим работаю. Это маленький хитрый педераст. Я думаю, что мы можем ссылаться на tabhost только изнутри tabhost. Любая попытка установить параметр хоста табуляции в действии терпит неудачу. Я получил ссылку на работу, когда действие изменяет свойство tabhost ... так, например, onclick of tab скрывает tabhost
проблема в файле ResourceDesigner.cs, просто прокомментируйте этот
TabWidget tabz = FindViewById<TabWidget>(Resource.Id.tabs);
и перестройте свое решение, и оно должно начать работать правильно, если не вернуться