文本观察器在片段



我有这个java文件:

package com.example.tabbedapp;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class Fragment1 extends Fragment {
protected TextView ulamekLabel;
protected EditText licznik;
protected EditText mianownik;
protected TextView kUlamkowa;
protected TextView calosci;
protected TextView nLicznik;
protected TextView nMianownik;
protected TextView kreska;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
licznik.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
skracamy();
}
});
mianownik.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
skracamy();
}
});
return inflater.inflate(R.layout.fragment1_layout, container, false);
}
private void skracamy() {
if (TextUtils.isEmpty((CharSequence) licznik) || TextUtils.isEmpty((CharSequence) mianownik)) {
calosci.setText("0");
calosci.setVisibility(View.INVISIBLE);
nLicznik.setText("0");
nLicznik.setVisibility(View.INVISIBLE);
nMianownik.setText("0");
nMianownik.setVisibility(View.INVISIBLE);
kreska.setVisibility(View.INVISIBLE);
return;
}
int a = Integer.parseInt(licznik.getText().toString());
int b = Integer.parseInt(mianownik.getText().toString());
int l = (a / NWD(a, b));//.toString().toInt();
int m = (b / NWD(a, b));//.toString().toInt();
int c = (l / m);//.toString().toInt();
int d = (l % m);//.toString().toInt();
calosci.setVisibility(View.VISIBLE);
nLicznik.setVisibility(View.VISIBLE);
nMianownik.setVisibility(View.VISIBLE);
kreska.setVisibility(View.VISIBLE);
if (c != 0 && d != 0) {
calosci.setText(c);
nLicznik.setText(d);
nMianownik.setText(m);
} else if (d != 0) {
calosci.setText("");
nLicznik.setText(d);
nMianownik.setText(m);
} else {
calosci.setText(c);
nLicznik.setText("0");
nMianownik.setText("0");
}
}
int NWD(int a, int b)
{
if(b!=0)
return NWD(b,a%b);
return a;
}
}

并且经常调试我得到这个错误:Attempt to invoke virtual method 'void android.widget.TextView.addTextChangedListener(android.text.TextWatcher)' on a null object reference。我正在一个片段上工作,所以我不能使用findViewById()。有人能帮忙吗?我只需要把视图赋值给一个指针。kreska = findViewById(R.id.kreska),但用于片段。我是java的新手。这个文件我实际上是从Kotlin翻译到java,但从main_activity到fragment。

您声明了视图,但忘记初始化它们。

所有视图都未初始化,这就是为什么显示null对象引用

声明

protected EditText licznik;
protected EditText mianownik;

Initliazation

licznik = findViewById(R.id.ID1);
mianownik = findViewById(R.id.ID2);

onCreateView内充气和返回视图

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.YOUR_FRAGMENT, container, false);
return view;
}

在onViewCreated内初始化视图

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
licznik = view.findViewById(R.id.ID1);
mianownik = view.findViewById(R.id.ID2);
...
}

可以面临一些崩溃时初始化视图内onCreateView因为有时观点并没有正确初始化。所以总是初始化onViewCreated中的视图。

在onCreateView(android.view)之后立即调用。LayoutInflater android.view。ViewGroup (android.os.Bundle)已经返回,但是在任何保存的状态被恢复到视图之前。这给了子类一个机会初始化自己,一旦他们知道他们的视图层次结构已经完全创建。然而,在这一点上,片段的视图层次结构并没有附加到它的父节点上。

onViewCreated是一个确保视图完全创建。