Не удается установить текст в TextView в Android Studio

#java #android

Вопрос:

У меня была эта проблема с каждым текстовым представлением. Я перепробовал много вещей, но мне просто не удается заставить это работать. Если у вас есть какие-либо предложения, пожалуйста, помогите. Я начинающий в Android, но я думаю, что это простая проблема, но я просто не могу ее решить. Заранее спасибо.

Код для фрагмента Home

 package com.example.mmreviews;


import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class HomeFragment extends Fragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    LayoutInflater lf = getActivity().getLayoutInflater();
    View view = lf.inflate(R.layout.fragment_home, container, false);
    view.findViewById(R.id.btn_edit).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getFragmentManager().beginTransaction().replace(R.id.fragment_container, new EditFragment()).commit();
        }
    });

    view.findViewById(R.id.btn_logout).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), LogIn.class);
            startActivity(intent);

        }
    });
    TextView textViewUsernameInfo = view.findViewById(R.id.username);
    textViewUsernameInfo.setText("Some text");

    return view;
}
}
 

Xml для текста, который я хочу задать. Может быть, мне стоит попробовать какой-нибудь другой текстовый вид?

 <TextView
                android:id="@ id/username"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toEndOf="@id/text1"
                android:layout_toRightOf="@id/text1"
                android:textColor="#4B83E5"
                android:textSize="16sp">

            </TextView>
 

исключение, которое я получаю

 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mmreviews, PID: 6184
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mmreviews/com.example.mmreviews.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.example.mmreviews.HomeFragment.onCreateView(HomeFragment.java:38)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
    at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
    at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1340)
    at android.app.Activity.performStart(Activity.java:7200)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2920)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6944) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 
 

Комментарии:

1. Пожалуйста, добавьте код в виде текста, а не в виде изображения.

2. На что это fragment_home.xml похоже? Пожалуйста, обновите свой исходный код теперь, когда вы исправили проблемы с раздуванием дубликатов макетов, которые выделил @GremlinShX.

Ответ №1:

Попробуйте это:

 TextView textViewUsernameInfo = (TextView)view.findViewById(R.id.username);
textViewUsernameInfo.setText("Some text");
 

По какой-то причине у вас есть два надувателя

      public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    //LayoutInflater inflater also inflater, but you decalre another inflater
            LayoutInflater lf = getActivity().getLayoutInflater();
 //and i assume you try to get lf  LayoutInflater from Activity not from Fragment
            View view = lf.inflate(R.layout.fragment_home, container, false);
        ...
        }
 

Попробуйте удалить

 LayoutInflater lf = getActivity().getLayoutInflater();
 

и измените свой взгляд на

  assert inflater != null;//not required but try to add
    View view = inflater.inflate(R.layout.fragment_home, container, false);
 
 

Согласно документам: onCreateView(LayoutInflater, ViewGroup, Bundle) создает и возвращает иерархию представлений, связанную с фрагментом, и объект LayoutInflater может использоваться для раздувания любых представлений во фрагменте.
Документы о фрагменте

UPD: Я не смогу воссоздать вашу ошибку.
Я создал простой XML для основного действия и для фрагмента отдельно
main_activity.xml

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.fragment.app.FragmentContainerView
        android:id="@ id/fragmentContainerView"
        android:name="com.example.test.MainFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
 

main_fragment.xml

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainFragment">

    <TextView
        android:id="@ id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#4B83E5"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
        
    </TextView>

    <Button
        android:id="@ id/btn_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@ id/btn_logout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
 

Создал класс фрагмента и оставил основную активность по умолчанию

 public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.main_activity);
    }
}
 

Класс фрагментов

 public class MainFragment extends Fragment {


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

        Button button1 =  view.findViewById(R.id.btn_edit);
        button1.setOnClickListener(v -> Toast.makeText (requireContext (),"short1",Toast.LENGTH_SHORT).show ());

        Button button2 =  view.findViewById(R.id.btn_logout);
        button2.setOnClickListener(v -> Toast.makeText (requireContext (),"short2",Toast.LENGTH_SHORT).show ());

        TextView textViewUsernameInfo = view.findViewById(R.id.username);
        textViewUsernameInfo.setText("Some text");

        return view;
}}
 

Он отлично работает без исключения NullPointerException для меня.
Вы можете попробовать привязку к просмотру от разработчиков Android или стороннюю библиотеку ButterKnife от JakeWharton (она устарела с 2021 года и не будет иметь дальнейших обновлений, потому что привязка к просмотру делает то же самое-все равно вы можете ее использовать.)

Комментарии:

1. К сожалению, это не помогает. Я все еще получаю одно и то же исключение.

2. @MilosMikalacki я обновил свой ответ, проверьте его, пожалуйста

3. Я добавил LayoutInflater lf = getActivity().getLayoutInflater(); когда я пробовал некоторые решения, и я забыл его удалить.

4. Это все еще показывает то же самое исключение. Есть ли другой вариант для этой ситуации, который сработал бы?

5. Мне удается заставить его работать с привязкой просмотра. Спасибо за помощь!