#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. Мне удается заставить его работать с привязкой просмотра. Спасибо за помощь!