提问人:Anton Duzenko 提问时间:10/31/2013 最后编辑:Anton Duzenko 更新时间:1/20/2015 访问量:1584
Android EditText 阻止其父级的 OnClickListener
Android EditText blocks its parent's OnClickListener
问:
1)我动态地创建了许多控件。我有一个中等大小的 RelativeLayout,其 EditText 填充了其大部分父可见空间。其余部分由另一个视图覆盖,布局应该在单击时向上滑动。问题是当用户单击 EditText 时,布局不会收到 onClick 事件。我不能使用TextView,因为我稍后需要用户在其中输入一些文本。我尝试了这段代码,但没有成功
private void addTopView() {
RelativeLayout midView = new RelativeLayout(this);
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.wallet_top);
imageView.setBackgroundColor(0xffff0000);
RelativeLayout.LayoutParams lp = new LayoutParams(scale(320), scale(heightTop));
midView.addView(imageView, lp);
RelativeLayout topCard = populateTPasses ? addTpass(0) : addCard(0);
topCard.setOnClickListener(topCardClick);
midView.addView(topCard);
lp = new LayoutParams(scale(320), scale(cardTopOffsetY + cardHeight));
lp.topMargin = scale(upperOffset);
walletScrollView.addView(midView, lp);
}
private RelativeLayout addCard(int indexVal) {
String cardName = "Add Credit Card";
String cardNum = "Max 16 digits";
String cardCVC = "Max 6 digits";
boolean switchStatus = NO;
String cardExpiry = dateFormatter.format(new Date());
if(indexVal < creditcards.size())
{
cardName = creditcards.get(indexVal).name;
cardNum = String.format("........%s", creditcards.get(indexVal).display);
cardCVC = "NOT STORED";
cardExpiry = creditcards.get(indexVal).expiry;
switchStatus = creditcards.get(indexVal).isDefault;
}
LayoutParams lp = new LayoutParams(scale(cardWidth), scale(cardHeight));
lp.leftMargin = scale(cardTopOffsetX);
lp.topMargin = scale(cardTopOffsetY);
RelativeLayout layout = new RelativeLayout(this);
layout.setLayoutParams(lp);
layout.setTag(indexVal);
addCardElements(layout, cardName, cardNum, cardExpiry, cardCVC, switchStatus);
return layout;
}
private ImageView addCardElements(RelativeLayout whichCard, String cardName, String cardNumber, String cardExpiry, String cardCVC, boolean defaultStatus) {
whichCard.setBackgroundResource(R.drawable.credit_card_tpay);
//Add card name
EditText cardNameField = addCardName(cardName);
whichCard.addView(cardNameField);
return null;
}
private EditText addCardName(String cName) {
EditText cardName = new EditText(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(scale(cardWidth - 90), LayoutParams.WRAP_CONTENT);
params.leftMargin = scale(32 + 50);
params.topMargin = scale(15);
cardName.setBackgroundColor(Color.TRANSPARENT);
cardName.setLayoutParams(params );
cardName.setTextColor(Color.WHITE);
if(isLast == NO || (_selectedIndex >= creditcards.size() && creditcards.size() != 0))
cardName.setText(cName);
else
{
cardName.setHint(cName);
}
isLast = NO;
cardName.setTag(kTag_CardName);
if(_selectedIndex >= creditcards.size())
cardName.setEnabled(YES);
else {
cardName.setEnabled(NO);
cardName.setFocusable(NO);
cardName.setFocusableInTouchMode(NO);
cardName.setClickable(NO);
cardName.setBackgroundColor(Color.YELLOW);
}
cardName.setGravity(5);
return cardName;
}
2)这个问题解决了。 当我的布局在 TranslateAnimation 的帮助下向上滑动时,我必须将其从其父级中删除并放到另一个 ViewGroup 上,否则所有用户输入都会被破坏。然后它以类似的父级变化向后滑动。在此过程中,我将布局的 OnClickListener 设置为 null 并返回到我的侦听器。问题是,在那之后,侦听器永远不会触发,布局只能滑动一次。我想知道是什么原因造成的。
答:
您有 2 个问题:
首先,您需要在添加 EditText(到 RelativeLayout)之前添加“可单击”内容。为此,您可以先添加它们,也可以在使用 时指定 index = 0 来执行此操作。addView
第二个问题是在翻译动画之后,您需要将布局参数更改为目标位置,以便它们可以获得点击。您可以使用动画侦听器,并在动画结束时将可单击内容的布局参数更新到新位置。
我真的说不出来,因为你没有包含相关代码。
在您的评论之后:
因此,您没有遇到第一个问题,因为您的可点击视图似乎在动画之后正确显示在上面。但是,第二个问题是您拥有的内容,因为即使它们出现在其上方,它们的真实位置仍然保持不变,这就是为什么您不会获得任何触摸事件的原因。您需要在动画结束后更新它们的位置 (LayoutParams)。
评论
我的经验是,与对 TextView 的单击不同,对 EditText 的单击不会传播到它的父级。你必须倾听孩子们自己的声音。
评论