Как мне не получить исключение nullpointer для моего фрагмента? - PullRequest
0 голосов
/ 14 декабря 2018

Таким образом, я получаю исключение нулевого указателя, когда открываю этот фрагмент.Не могли бы вы помочь?

 public class ProfileFragment extends Fragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container, @Nullable Bundle savedInstanceState) {


    Bundle bundle = getArguments();
    String eka;
    if(bundle.containsKey("Name:")) {
        eka = bundle.getString("Name:");
        String toka;
        toka = bundle.getString("Country");


        TextView ekat = (TextView) getView().findViewById(R.id.nimit);
        TextView tokat = (TextView) getView().findViewById(R.id.maat);
        ekat.setText(eka);
        tokat.setText(toka);
    }


    return inflater.inflate(R.layout.fragment_profile, container, false);
}
}

Вот действие, которое я отправляю из

  public class MainActivity extends AppCompatActivity {


EditText edit, editt, edittt, editttt;
Button btn;


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

    edit = (EditText) findViewById(R.id.nimi);
    editt = (EditText) findViewById(R.id.maa);
    edittt = (EditText) findViewById(R.id.salasana);
    editttt = (EditText) findViewById(R.id.syntymäaika);
    btn = (Button) findViewById(R.id.nappi);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String eka = edit.getText().toString();
            String toka = editt.getText().toString();

            Bundle bundle = new Bundle();
            bundle.putString("Name:", eka);
            bundle.putString("Country", toka);

            ProfileFragment profileFragment = new ProfileFragment();
            profileFragment.setArguments(bundle);
            edit.setVisibility(View.GONE);
            editt.setVisibility(View.GONE);
            edittt.setVisibility(View.GONE);
            editttt.setVisibility(View.GONE);
            btn.setVisibility(View.GONE);
        }
     });

, и я получаю эту ошибку:

java.lang.NullPointerException: попытка вызвать виртуальный метод 'boolean android.os.Bundle.containsKey (java.lang.String)' для нулевой ссылки на объект

Так что приложение вылетает всякий раз, когда я открываю фрагмент.По какой-то причине он не отправляет информацию об активности во фрагмент.Спасибо за помощь.

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Исходя из того, что я вижу, вы пропустили транзакцию фрагмента, поэтому я предполагаю, что вы статически отображаете фрагмент, определяя его в файле xml (вам необходимо опубликовать файл activity_layout.xml, чтобы быть уверенным) В вашем activity_main.xml вам нужно иметь FrameLayout

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".login.AuthenticationActivity">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

, а затем внутри вашего View.OnClickListener вы можете сделать

Bundle bundle = new Bundle(); 
bundle.putString("Name:", eka); 
bundle.putString("Country", toka); 

ProfileFragment profileFragment = new ProfileFragment();
profileFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
edit.setVisibility(View.GONE);
//Continue with your code

Также хорошей практикой является получение аргументов в onCreate()

Переопределите onCreate() и выполните следующее

    @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if(bundle.containsKey("Name:")) {
    eka = bundle.getString("Name:"); // make this field to use in onCreateView()
    toka = bundle.getString("Country"); // make this field to use in onCreateView()

, затем в onCreateView() вам понадобится следующее

 @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);
    TextView ekat = (TextView) view.findViewById(R.id.nimit);
    TextView tokat = (TextView) view.findViewById(R.id.maat);
    ekat.setText(eka);
    tokat.setText(toka);
}
0 голосов
/ 14 декабря 2018

Вы пытаетесь получить Bundle, то есть null здесь:

Bundle bundle = getArguments();
....
if(bundle.containsKey("Name:")) {

В вашем фрагменте получить данные (например, в методе onCreate ()) с помощью:

Bundle bundle = this.getArguments();
if (bundle != null) {
   int myInt = bundle.getInt(key, defaultValue);
}

Вот диаграмма, объясняющая lifecycle из fragment enter image description here

0 голосов
/ 14 декабря 2018

Используя: public static String eka = "";public static String toka = "";

о вашей активности и доступ к ней по адресу: MainActivity.eka MainActivity.toka

Это прекратит сбой.

0 голосов
/ 14 декабря 2018

Вы не можете использовать getView(), пока не вернется onCreateView().

Переместите все, что у вас есть над оператором return, в onViewCreated().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...