gpt4 book ai didi

Android 无法在 fragment 中按 ID 找到 View

转载 作者:行者123 更新时间:2023-11-29 14:53:48 25 4
gpt4 key购买 nike

我有一个自定义的 EditText MomentumEditText,我在 xml (fragment_edit_text.xml) 的布局中:

<?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>

我可以在 fragment 中成功膨胀和显示布局,但尝试使用 View.findViewById(R.id.writing_edittext) 获取 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);
}

我也尝试从 onStart() 获取 MomentumEditText,但它仍然返回 null。

编辑 = 我尝试用纯 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;

}

}

最佳答案

尝试将 attach to root 设置为 false,因为你是 root!

@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;
}

关于Android 无法在 fragment 中按 ID 找到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11126538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com