Android在片段中找不到按ID显示的视图
我在xml fragment\u edit\u text.xml的布局中有一个自定义的EditText MomentumEditText:Android在片段中找不到按ID显示的视图,android,android-fragments,findviewbyid,Android,Android Fragments,Findviewbyid,我在xml fragment\u edit\u text.xml的布局中有一个自定义的EditText MomentumEditText: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.frazerm.momentum.MomentumEditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/writing_edittext"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
我还尝试从onStart获取MomentumEditText,但它仍然返回null
@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);
}
Edit=我尝试用纯EditText替换xml中的自定义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;
}
}
尝试将“附加到根”设置为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;
}
尝试将“附加到根”设置为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;
}
我猜fragment_edit_text.xml就是您在问题中显示的布局文件
如果是,请检查在指定某些配置(如语言、密度等)的某些文件夹中是否没有其他同名布局
例如,您可能有:
/布局/片段\u编辑\u text.xml
及
/layout land/fragment_edit_text.xml
但是在layout land目录中只有您的自定义视图,因此它可以编译,但在纵向模式下,您的findViewById将返回null我猜fragment_edit_text.xml就是您在问题中显示的布局文件
如果是,请检查在指定某些配置(如语言、密度等)的某些文件夹中是否没有其他同名布局
例如,您可能有:
/布局/片段\u编辑\u text.xml
及
/layout land/fragment_edit_text.xml
但是只有在layout land目录中有自定义视图,因此它可以编译,但在纵向模式下,findViewById将返回null请尝试将这行代码移到onActivityCreated方法中:
MomentumEditText editText = (MomentumEditText) findViewById(R.id.writing_edittext);
请尝试将这行代码移到onActivityCreated方法中:
MomentumEditText editText = (MomentumEditText) findViewById(R.id.writing_edittext);
因为要扩展当前视图,所以需要覆盖所有可以使用的构造函数。尝试:
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
}
}
参考:公共构造函数因为要扩展当前视图,所以需要覆盖所有可以使用的构造函数。尝试:
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
}
}
参考:公共构造函数您只需要xmlns:android=http://schemas.android.com/apk/res/android 在你的根元素中,顺便说一句,是的,有人建议把它放在自定义视图中解决了这个问题,但它没有t@Frazerm63也许给我们看看MomentumEditText的代码你扩展编辑文本了吗?@Blundell是的,它扩展了EditTextYou只需要xmlns:android=http://schemas.android.com/apk/res/android 在你的根元素中,顺便说一句,是的,有人建议把它放在自定义视图中解决了这个问题,但它没有t@Frazerm63也许给我们看看MomentumEditText的代码你扩展了编辑文本吗?@Blundell是的,它扩展了编辑文本没有。布局膨胀并正确显示,它是editText=MomentumEditText root.findviewbydr.id.writing\u editText;返回null@Frazerm63是的,他说如果你在/layout/和/layout land/中有fragment_edit_text.xml,但在layout land folders xml文件中只有MomentumEditText,它将返回null谢谢你的编辑,布伦德尔。现在看起来更清楚了;-@Frazerm63:最后,运行debug并检查充气返回的视图中有哪些子项。子项在那里,但mID=-1,这意味着它没有ID。我在项目中只有一个同名的布局文件没有。布局膨胀并正确显示,它是editText=MomentumEditText root.findviewbydr.id.writing\u editText;返回null@Frazerm63是的,他说如果你在/layout/和/layout land/中有fragment_edit_text.xml,但在layout land folders xml文件中只有MomentumEditText,它将返回null谢谢你的编辑,布伦德尔。现在看起来更清楚了;-@Frazerm63:最后,运行debug并检查充气返回的视图中有哪些子项。子项在那里,但mID=-1,这意味着它没有ID。我在项目中只有一个同名的布局文件