【发布时间】:2017-07-11 16:30:24
【问题描述】:
各位程序员大家好。在为 android 创建应用程序时,我遇到了一个问题。我想以编程方式创建 LinearLayout。然后我想以编程方式用不同的元素填充它。之后,我想获取此 LinearLayout 的高度以在将来使用它(例如,用于动画)并将其可见性设置为消失。我在 Activity 的 OnCreate 中执行的所有这些操作,所以如果我尝试获取高度,我得到 0。 任何人都可以帮我解决这个问题。我们将不胜感激所有建议。
更新
Gotiasits 和 Abbas 这里是代码
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.TestLayout);
ScrollView contentScroll = FindViewById<ScrollView>(Resource.Id.contentScroll);
LinearLayout contentContainer = FindViewById<LinearLayout>(Resource.Id.contentContainer);
List<DetailsData> dataList = new List<DetailsData>();
for (int i = 0; i < 3; i++)
{
string header = "Header " + " " + i.ToString();
string title = "Title " + i.ToString();
string subtitle = "Subtitle";
string pretext = "Some words in pretext. Some words in pretext. Some words in pretext. Some words in pretext. Some words in pretext. Some words in pretext.Some words in pretext. Some words in pretext.";
int[] images = { Resource.Drawable.detail_main1, Resource.Drawable.detail_main2, Resource.Drawable.detail_main3, Resource.Drawable.detail_main1,
Resource.Drawable.detail_main2, Resource.Drawable.detail_main3, Resource.Drawable.detail_main1 };
string[] features =
{
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
"OSome words in featurelist.",
};
dataList.Add(new DetailsData(i, header, title, subtitle, pretext, features, images));
}
testContainer = new TestContaier(this, dataList, contentContainer, contentScroll, false);
testContainer.DataBind();
}
class TestContaier
{
Activity _context;
public List<DetailsData> _dataSource { get; private set; }
LinearLayout _mainLayout;
ScrollView _scrollContainer;
public TestContaier(Activity context, List<HotelDetailsData> dataSource, LinearLayout mainLayout, ScrollView scrollContainer)
{
_context = context;
_dataSource = dataSource;
_mainLayout = mainLayout;
_firstExpanded = firstExpanded;
_scrollContainer = scrollContainer;
}
public void DataBind()
{
bool isFirst = true;
if (_dataSource != null)
{
foreach (var _dataItem in _dataSource)
{
TextView header = new TextView(_context)
{
Text = _dataItem._header
};
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MatchParent, LinearLayout.LayoutParams.WrapContent);
header.SetTextColor(Color.ParseColor(_settings._headerTextColor));
header.SetBackgroundColor(Color.ParseColor(_settings._headerBackgroundColor));
header.LayoutParameters = lp;
View contentView = _context.LayoutInflater.Inflate(Resource.Layout.DetailItem, null);
ContentViewHolder holder = new ContentViewHolder();
InitHolder(holder, contentView);
FillHolder(holder, _dataItem);
contentView.Visibility = ViewStates.Gone;
holder.initialize(contentView);
contentView.Tag = holder;
header.AssociatedContent = contentView;
_mainLayout.AddView(header);
_mainLayout.AddView(contentView);
}
}
}
void InitHolder(ContentViewHolder holder, View view)
{
holder.imageSlider = view.FindViewById<ViewFlipper>(Resource.Id.imageSlider);
holder.imagesContainer = view.FindViewById<LinearLayout>(Resource.Id.scrollImagesContainer);
holder.detailTitle = view.FindViewById<TextView>(Resource.Id.detailTitle);
holder.detailSubtitle = view.FindViewById<TextView>(Resource.Id.detailSubtitle);
holder.detailPretext = view.FindViewById<TextView>(Resource.Id.detailPreText);
holder.detailFeatureList = view.FindViewById<LinearLayout>(Resource.Id.detailFeatureList);
holder.nextSliderButton = view.FindViewById<ImageButton>(Resource.Id.nextSliderButton);
holder.prevSliderButton = view.FindViewById<ImageButton>(Resource.Id.prevSliderButton);
}
void FillHolder(AccordionContentViewHolder holder, HotelDetailsData dataItem)
{
/// filling holder with data
}
}
【问题讨论】:
-
您是如何以及何时访问高度的?
-
这是因为当视图完全绘制时,您应该获得视图的高度,例如
onResume()而不是onCreate()。 -
致@Abbas 例如在设备屏幕上渲染布局后。但未链接到任何用户操作。它应该“自动”完成
-
To @MaskedMan Nope,在 OnResume() 中它显示为 0,就像在 OnCreate 中一样。
-
@AdeptusMechanicus 你还没有显示 How 即代码。