2012-06-20 5 views
1

에서 ID로보기를 찾을 수 없습니다 조각을 만들었지 만 을 사용하려고하면 View.findViewById(R.id.writing_edittext)을 반환합니다. 안드로이드 내가 내가 XML로 레이아웃에있는 사용자 정의 글고 <code>MomentumEditText</code> (fragment_edit_text.xml)가 조각

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View root = inflater.inflate(R.layout.fragment_edit_text, container, true); 
    MomentumEditText editText = (MomentumEditText) root.findViewById(R.id.writing_edittext); 
} 

는 또한 onStart()에서 MomentumEditText을 얻기 위해 노력했다,하지만 여전히 null를 돌려줍니다.

편집 = xml의 사용자 지정 EditText를 일반 EditText로 바꾸려고 시도했지만 findViewById()가 작동합니다! 여기에 MomentumEditText가 있습니다 :

package com.frazerm.momentum; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.AttributeSet; 
import android.view.Gravity; 
import android.view.MotionEvent; 
import android.widget.EditText; 

public class MomentumEditText extends EditText { 

boolean moveCursorDisabled = true; 
boolean deleteCharsDisabled = true; 

private static Paint linePaint; 
private static Paint marginPaint; 
MomentumEditText thisEditText = this; 

Editable currentText; 

public MomentumEditText(Context context, AttributeSet attrs) { 
    super(context); 

    setCursorVisible(true); 
    this.setGravity(Gravity.TOP); 
    TextWatcher inputTextWatcher = new TextWatcher() { 
     CharSequence textToAdd = ""; 
     boolean charWasDeleted = false; 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      if (moveCursorDisabled) { 
       if(count > after) { 
        textToAdd = s.subSequence(start + after, start + count); 
        charWasDeleted = true; 
       } 
      } 
     } 

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

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      if (moveCursorDisabled) { 
       if (charWasDeleted == true) { 
        charWasDeleted = false; 
        s.append(textToAdd); 
       } 
       else { 
        thisEditText.setSelection(thisEditText.getText().length()); 
       } 
      } 
     } 

    }; 
    this.addTextChangedListener(inputTextWatcher); 

} 

//disables ability to move the cursor to other parts of the text 
@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    if (deleteCharsDisabled) { 
     final float eventX = event.getX(); 
     if(getSelectionStart() != eventX) 
     { 
      super.onTouchEvent(event); 
      thisEditText.setSelection(thisEditText.getText().length()); 
      return true; 
     } 
     return super.onTouchEvent(event); 
    } 
    return super.onTouchEvent(event); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    linePaint = new Paint(); 
    linePaint.setColor(0x77777777); 
    //linePaint.setStyle(Style.STROKE); 

    marginPaint = new Paint(); 
    marginPaint.setColor(0x99FF4444); 
    //marginPaint.setStyle(Style.STROKE); 

    Rect bounds = new Rect(); 
    int firstLineY = getLineBounds(0, bounds); 
    int lineHeight = getLineHeight(); 
    int totalLines = Math.max(getLineCount(), getHeight()/lineHeight); 

    for (int i = 0; i < totalLines; i++) { 
     int lineY = firstLineY + i * lineHeight + dip(2); 
     canvas.drawLine(0, lineY, bounds.right, lineY, linePaint); 
    } 


    canvas.drawLine((float) dip(64), (float) 0, (float) dip(64), getHeight(), marginPaint); 

    super.onDraw(canvas); 
    setPadding(dip(64), 0, 0, 0); 
} 

public void setCursorMoveAllowed(boolean allowed) { 
    moveCursorDisabled = !allowed; 
    setCursorVisible(allowed); 
    return; 
} 

public void setBackspaceAllowed(boolean allowed) { 
    deleteCharsDisabled = !allowed; 
    return; 
} 

public boolean superTouchEvent(MotionEvent event) { 
    return super.onTouchEvent(event); 
} 

public int dip (int dip) { 
    float d = this.getResources().getDisplayMetrics().density; 
    int pixels = (int)(dip * d);   
    return pixels; 

} 

} 
+0

= 안드로이드 "http://schemas.android.com/apk/res/android"'루트 요소에, btw. –

+0

그래, 어딘가 사용자 정의보기에 퍼팅하면이 문제를 해결할 수 있다고 제안되었지만 – Frazerm63

+0

@ Frazerm63 아마도 'MomentumEditText'에 대한 코드를 표시합니다. 텍스트를 편집 하시겠습니까? – Blundell

답변

1

당신이 사용할 수있는 모든 생성자를 오버라이드 (override) 할 필요가 현재 뷰를 확장하고 있기 때문에. 시도 :

public class MomentumEditText extends EditText { 

    public MomentumEditText(Context context) { 
     super(context); 
     init(); 
    } 

    public MomentumEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); // This is the constructor used by XML (you were missing the super call) 
     init(); 
    } 

    public MomentumEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defstyle); 
     init(); 
    } 

    private void init(){ 
     setCursorVisible(true); 
     // your other code 
    } 
} 

참조 : http://developer.android.com/reference/android/widget/EditText.html (공공 생성자)에만`의 xmlns 필요

4

당신이 루트이므로 첨부를 false로 설정해보십시오!

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.fragment_edit_text, container, false); 

    MomentumEditText editText = (MomentumEditText) root.findViewById(R.id.writing_edittext); 

    return root; 
} 
+0

이렇게해야합니다. –

+0

그 중 하나도 작동하지 않았다 – Frazerm63

0

나는 fragment_edit_text.xml이 귀하의 질문에 표시 한 레이아웃 파일이라고 생각하십니까?

예인 경우 일부 구성 (예 : 언어, 밀도 등)을 지정하는 일부 폴더에 같은 이름의 다른 레이아웃이 없는지 확인하십시오.

/layout-land/fragment_edit_text.xml

/layout/fragment_edit_text.xml

을하지만, 단지 layout-land 디렉토리
내에서 사용자 정의보기를 가지고, 따라서이 확인 컴파일하지만 경우에 :

예를 들어, 당신은 할 수 있습니다 세로 모드 findViewByIdnull

을 반환합니다.
+0

그렇지 않습니다. 레이아웃이 팽창하고 올바르게 표시됩니다. null을 반환하는 것은'editText = (MomentumEditText) root.findViewById (R.id.writing_edittext);'입니다. – Frazerm63

+0

@ Frazerm63 예'fragment_edit_text.xml '이 있으면 null을 반환한다고 말합니다. 'layout-land' 폴더 안에'MomentumEditText' 만 가지고 있습니다. – Blundell

+0

Blundell. 편집 해 주셔서 감사합니다.이제 더 명확 해 보입니다 ;-) @ Frazerm63 : 결국, 디버그를 실행하고 팽창에서 반환 된 뷰에있는 자식을 확인하십시오. – Seraphis

1

는 대신 onActivityCreated 방법으로 코드 줄을 이동하십시오 :

MomentumEditText editText = (MomentumEditText) findViewById(R.id.writing_edittext);