6

1) 多数のコントロールを動的に作成します。親の表示スペースのほとんどを埋める EditText を持つ中規模の RelativeLayout があります。残りは別のビューでカバーされ、レイアウトはクリックするとスライドアップするはずです。問題は、ユーザーが 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 に設定し、リスナーに戻します。問題は、その後リスナーが起動せず、レイアウトが一度しかスライドできないことです。何が原因なのだろうか。

4

2 に答える 2

1

私の経験では、TextView のクリックとは異なり、EditText のクリックはその親に伝播しません。あなたは子供たち自身に耳を傾ける必要があります。

于 2015-01-19T19:29:34.823 に答える
-1

2 つの問題があります。

まず、EditText を (RelativeLayout に) 追加する前に、「クリック可能な」コンテンツを追加する必要があります。これを行うには、最初にそれらを追加するか、使用時に index = 0 を指定しますaddView

2 つ目の問題は、アニメーションの変換後です。クリックを取得できるように、レイアウト パラメータをターゲットの場所に変更する必要があります。アニメーション リスナーを使用して、アニメーションの終了時に、クリック可能なコンテンツのレイアウト パラメータを新しい場所に更新できます。

関連するコードが含まれていないため、実際にはわかりません。


コメントの後:

アニメーションの後、クリック可能なビューが上に正しく表示されているように見えるため、最初の問題はありません。ただし、2 番目の問題は、その上に表示されても、実際の位置は変更されないため、タッチ イベントが発生しないためです。アニメーションが終了したら、位置 (LayoutParams) を更新する必要があります。

于 2013-10-31T09:41:56.570 に答える