android - Id 是正确的,但是 - java.lang.NullPointerException: android.widget.TextView.setText(java.lang.CharSequence)' 在空对象引用上
问题描述
我在 setText() 的 NPE 上遇到了这么长时间的麻烦。
Tab1Fragment 中的一些状态,我可以通过以下代码看到:
- 文本视图为空。
- fullText 获得了理想的价值。
我错过了什么吗?我唯一的目的是在点击时从 HomeFragment 中的 listView 更新 Tab1Fragment 中的 TextView。(这似乎遥遥领先于我)
提前谢谢。
HomeFragment.java
public class HomeListAdapter extends BaseAdapter {
AddLawMap addLawMap = new AddLawMap();
private final ArrayList<String> list;
private Tab1Fragment tab1Fragment = new Tab1Fragment();
private Tab2Fragment tab2Fragment = new Tab2Fragment();
private Tab3Fragment tab3Fragment = new Tab3Fragment();
private GetTextFragment getTextFragment = new GetTextFragment();
...
@Override
public View getView(int position, View convertView, ViewGroup parent){
final View result;
if(convertView == null){
result = LayoutInflater.from(parent.getContext()).inflate(R.layout.home_item, parent, false);
}else{
result = convertView;
}
if(getCount() != 0) {
String itemId = getItem(position);
final TextView tv1 = result.findViewById(R.id.text_home_item);
tv1.setTag(itemId);
tv1.setText(addLawMap.getMapString().get(itemId));
result.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
final String tag = tv1.getTag().toString();
AlertDialog.Builder builder2 = new AlertDialog.Builder(mcontext);
builder2.setTitle(R.string.choose_fragment)
.setItems(R.array.choose_fragment, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(mcontext, R.string.after_set_fulltext_toast, duration);
switch (which) {
case 0:
tab1Fragment.setFullText(getTextFragment.getFileStream(tag));
tab1Fragment.updateUi();
toast.show();
break;
...
}
}
});
AlertDialog dialog2 = builder2.create();
dialog2.show();
}
});
return result;
}else {
return result;
}
}
}
Tab1Fragment.java
public class Tab1Fragment extends Fragment {
private static final String ARG_COUNT = "param1";
private Integer counter;
private Handler mHandler = new Handler(Looper.getMainLooper());
private String fullText;
private int numSetText;
private int numTab1;
@NonNull TextView textView;
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.i("TAB1_FRAGMENT", "/onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
counter = getArguments().getInt(ARG_COUNT);
}
numTab1 = 0;
numSetText = 0;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container, Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
Log.i("TAB1_FRAGMENT", "/onCreateView");
return inflater.inflate(R.layout.fragment_tab1, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
TextView textView = (TextView) getView().findViewById(R.id.tab1_textview);
if(fullText == null){
ImageView imageView = (ImageView) getView().findViewById(R.id.none_added);
imageView.setVisibility(View.VISIBLE);
textView.setVisibility(View.INVISIBLE);
}else{
textView.setText(fullText);
}
Log.i("TAB1_FRAGMENT", "/onViewCreated");
}
public void setFullText(String fullText){
this.fullText = fullText;
Log.i("TAB1_FRAGMENT", "/setFullText()");
++ numSetText;
}
public void updateUi(){
if(fullText != null){
mHandler.post(new Runnable() {
@Override
public void run() {
textView.setText(fullText);
++numTab1;
}
});
}
}
@Override
public void onPause() {
super.onPause();
Log.i("TAB1_FRAGMENT", "/onPause");
}
@Override
public void onStart(){
super.onStart();
Log.i("TAB1_FRAGMENT", "/onStart");
}
@Override
public void onResume(){
super.onResume();
Log.i("TAB1_FRAGMENT", "/onResume");
}
@Override
public void onDetach(){
super.onDetach();
mHandler = null;
}
fragment_tab1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/none_added"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/tab_none_added"
android:visibility="gone"/>
<TextView
android:id="@+id/tab1_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingExtra="3dp"/>
</LinearLayout>
日志猫
2020-06-08 22:52:25.855 9668-9668/com.example.morina.mylaw I/TAB1_FRAGMENT: /setFullText()
2020-06-08 22:52:25.881 9668-9668/com.example.morina.mylaw W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed.
2020-06-08 22:52:25.882 9668-9668/com.example.morina.mylaw E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.morina.mylaw, PID: 9668
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.example.morina.mylaw.Tab1Fragment$1.run(Tab1Fragment.java:82)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
解决方案
您只是实例化 newTab1Fragment
但不将其呈现到屏幕上。在使用fragment.isInLayout()
.
推荐阅读
- r - 从列表中获取值,这些值是 R 函数中的参数
- typescript - 在 Typescript 中防止不适当的导入和执行项目层次结构
- javascript - 电子JS中的capturePage
- python - 用 Pandas 中的数据框值标记散点图的标题
- python - 从 Json Python 获取特定的字段值
- git - 为什么 .gitignore 中的目录仍然被“git status”跟踪?
- memory-management - 向量函数的分配是原子的吗?(无法理解错误)
- python - 如何每行仅合并一次数据框
- kotlin - 将 javascript 对象数组传递给 kotlin 函数
- java - 使用 Azure SDK for Java 调用 Azure Migrate Rest Api