片段中的Android:getArguments()返回null,即使我在newInstance()中设置了setArguments()

片段中的Android:getArguments()返回null,即使我在newInstance()中设置了setArguments(),android,android-fragments,Android,Android Fragments,我想使用newInstance()方法将参数传递给我的PopularMoviesFragment。我有main活动其中onOptionsItemSelected()我使用PopularMoviesFragment.newInstance(“popularity.desc”)创建一个片段,然后进行事务处理 在PopularMoviesFragment:我使用setArguments()设置参数newInstance(字符串排序),但是当我想在onCreate()中检索它们时,getArgument

我想使用
newInstance()
方法将参数传递给我的
PopularMoviesFragment
。我有
main活动
其中
onOptionsItemSelected()
我使用
PopularMoviesFragment.newInstance(“popularity.desc”)
创建一个片段,然后进行事务处理

PopularMoviesFragment
:我使用
setArguments()
设置参数
newInstance(字符串排序)
,但是当我想在
onCreate()
中检索它们时,
getArguments()
返回null

下面是代码,
PopularMoviesFragment

public class PopularMoviesFragment extends Fragment {


  public static PopularMoviesFragment newInstance(String sortBy) {
      PopularMoviesFragment fragment = new PopularMoviesFragment();
      Bundle args = new Bundle();
      args.putString("sortBy", sortBy);
      fragment.setArguments(args);
      return fragment;
  }

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      String sortBy = getArguments().getString("sortBy", ""); 
      
      // java.lang.NullPointerException in the previous line
      // Attempt to invoke virtual method 'java.lang.String 
      // android.os.Bundle.getString(java.lang.String, java.lang.String)' 
      // on a null object reference
  }
}
和内部
main活动

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_popular_movies:
            PopularMoviesFragment fragment = PopularMoviesFragment.newInstance("popularity.desc");
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, fragment)
                    .commit();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

重写片段中的onActivityCreated()方法,并使用此行检索此方法中的sortBy值-
String sortBy=getArguments().getString(“sortBy”,”)
而不是
onCreate()
方法。

我尝试了粘贴的代码。奇怪的是,我根本没有得到NullPointerException。

TestActivity.java:

package com.example.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class TestActivity extends AppCompatActivity {

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

        Button btn_test = findViewById(R.id.btn_test);

        btn_test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                testFragment();
            }
        });

    }

    private void testFragment() {
        PopularMoviesFragment fragment = PopularMoviesFragment.newInstance("popularity.desc");
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .commit();
    }

}
activity_test.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"

    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:text="test"
        android:textSize="32sp"
        android:textColor="#000"
        android:id="@+id/btn_test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content"></FrameLayout>


</LinearLayout>

不幸的是,这没有帮助。这会导致相同的NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.os.Bundle.getString(java.lang.String,java.lang.String)”。嘿,感谢您的检查。它不一定能解决我的问题,但它确实帮助我理解问题出在其他地方。所以,使用NullPointer的原因是,我对FragmentManager进行了另一次调用,在该调用中,我将容器替换为相同的PopularMoviesFragment对象,但它是通过构造函数而不是newInstance()方法创建的。所以它导致了NullPointerException。谢谢你的时间,我会接受你的回答,因为这是最有帮助的。
package com.example.myapplication;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.View;

public class PopularMoviesFragment extends Fragment {


    public static PopularMoviesFragment newInstance(String sortBy) {
        PopularMoviesFragment fragment = new PopularMoviesFragment();
        Bundle args = new Bundle();
        args.putString("sortBy", sortBy);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String sortBy = getArguments().getString("sortBy", "");

        Log.i("test", "sortBy=" + sortBy);

    }
}