2016-08-04 11 views
-2

PinViewという名前のカスタムビューをRelativeLayoutから拡張しました。 コンストラクタでは、私は自分のinit()メソッドを呼び出し、レイアウトからビューを展開します。カスタムビューが初期化されているうちにカスタムビューにビューを展開できないのはなぜですか?

inflate(getContext(), R.layout.layout_pin_view, this); 

このフローを実行した後、私は他のビュー(Imageview)をこのビューに追加する必要があります(addView()をリクエストしてください)。そして、スロー:

catch (NoSuchMethodException e) { 
      InflateException ie = new InflateException(attrs.getPositionDescription() 
        + ": Error inflating class " 
        + (prefix != null ? (prefix + name) : name)); 
      ie.initCause(e); 
      throw ie; 

を私はsuccessly膨らませることができます。

mLlPins.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       mLlPins.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       .... 
       .... 
       addView(...) 



      } 
     }); 

あなたは私たちが同期で膨らませると、ダイナミックビューを作成傾ける理由のアイデアを持っていますか?

私のコード部分:

私の理解で
private void init() { 
    View view = inflate(getContext(), R.layout.layout_pin_view, this); 
    mEtPin = (PinEditText) view.findViewById(R.id.etPin); 
    mLlPins = (LinearLayout) view.findViewById(R.id.llPins); 
    mEtPin.setVisibility(View.VISIBLE); 
    mEtPin.setFilters(new InputFilter[]{new InputFilter.LengthFilter(mMaxLength)}); 
    mEtPin.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      return false; 
     } 
    }); 
    mEtPin.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      if (mImageViews != null) { 
       for (int i = 0; i < mImageViews.length; i++) 
        mImageViews[i].setEnabled(i < s.length()); 
       if (s.length() == mMaxLength) { 
        InputMethodManager imm = (InputMethodManager) mEtPin.getContext().getSystemService(
          Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(mEtPin.getWindowToken(), 0); 
       } 
      } 
     } 
    }); 
    mLlPins.setClickable(false); 
    mEtPin.setText(mEtPin.getText()); 

    mEtPin.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      if (mImageViews == null) return; 
      for (int i = 0; i < mMaxLength; i++) { 
       if (mImageViews[i] != null) { 
        if (i < s.length()) { 
         mImageViews[i].setImageAlpha(255); 
         continue; 
        } 
       } 
       mImageViews[i].setImageAlpha(0); 
      } 

     } 
    }); 

    setMaxLength(4); 
} 
private void setMaxLength(int maxLength) { 
    LayoutInflater inflater = LayoutInflater.from(mLlPins.getContext()); 
    mMaxLength = maxLength; 
    mEtPin.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)}); 
    mImageViews = new ImageView[maxLength]; 
    mLlPins.removeAllViews(); 
    int totalContentLenght = mLlPins.getMeasuredWidth() - dpToPx((maxLength - 1) * mMargin); 
    int itemWidthHeight = totalContentLenght/maxLength; 
    int itemMargin = dpToPx(mMargin/2); 
    int itemPadding = (int) (itemWidthHeight * srcRatio); 
    for (int i = 0; i < maxLength; i++) { 
     mImageViews[i] = (ImageView) inflater.inflate(mPinImage, null); 
     mImageViews[i].setEnabled(false); 
     mImageViews[i].setPadding(itemPadding, itemPadding, itemPadding, itemPadding); 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(itemWidthHeight, itemWidthHeight); 
     if (i == 0) { 
      params.setMargins(0, 0, itemMargin, 0); 
     } else if (i < maxLength - 1) { 
      params.setMargins(itemMargin, 0, itemMargin, 0); 
     } else { 
      params.setMargins(itemMargin, 0, 0, 0); 

     } 
     mImageViews[i].setImageAlpha(0); 
     mLlPins.addView(mImageViews[i], params); 

    } 

} 
+1

'あなたのコンストラクタを投稿してくださいは、init()'メソッド、およびスタックトレースを捕まった「例外」から。 –

+1

ああ!それは私のせいです。ログを取得しようとしているときに問題が見つかりました。アクティビティでは、作成後、このアクティビティはいくつかのコントロールによって閉じられます。このプロセスをデバッグすると、私が書いたようにエラーがスローされます。私はこの質問を閉じる必要があります。また、ビューのサイズを取得するためにgloballayoutlistenerを使用する必要があります:) – atasoyh

答えて

1

、あなたがあるため、親ビューのビュー(コンテナとして言う)あなたが追加したときに、そのすべてのレイアウトパラメータが確定していないことを意味する描かれていないを膨らませることができませんビューは、コンテナがまだ開始されていないため、独自のビューパラメータを計算できません。 あなたは、コンテナのonCreateメソッド内の開始子ビューのメソッドを使用する場合は、あなたがあなたのコンテナ内で、次の作成方法試してください可能性があります

containerVariable.post(new Runnable(){ 
    @Override 
    public void run(){ 
     // initiate your child view and add child view here 
    } 
}); 
+0

GlobalLayoutListenerの代わりに使用できますか?どちらがより適切な方法ですか? – atasoyh

+1

私の理解では、GlobalLayoutListenerは標準のAndroidライブラリで提供されるメソッドですが、GlobalLayoutListenerが異なるAndroidバージョンの問題を扱う必要があるためpostメソッドを推奨し、postメソッドはある種のプロセス処理方法です。 –

関連する問題