无法从活动获取到片段的bundle值



请帮忙,我刚刚学会了安卓,我正在尝试使用捆绑包将数据从我的主要活动发送到片段。这是 MainActivity 的代码

@Override
public boolean onQueryTextChange(String newText) {
if (newText.length()>0){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("query", newText);
SearchMovieFragment searchMovieFragment = new SearchMovieFragment();
searchMovieFragment.setArguments(bundle);
transaction.replace(R.id.frame_container, searchMovieFragment);
transaction.commit();
}

这是我片段中的代码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String query = getArguments().getString("query");
MoviesViewModel moviesViewModel = ViewModelProviders.of(this).get(MoviesViewModel.class);
moviesViewModel.setSearchedMovie(query);
moviesViewModel.getMovie().observe(this, getListMovies);
return inflater.inflate(R.layout.fragment_movies, container, false);
}

此行中发生错误String query = getArguments().getString("query");错误是

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'java.lang.String android.os.Bundle.getString(java.lang.String('

我该如何解决这个问题?

这是我的主要活动

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarGradiant(this);
setContentView(R.layout.activity_main);
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(sectionsPagerAdapter);
TabLayout tabs = findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null){
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.color_primary_gradient));
}
getSupportActionBar().setElevation(0);
}
protected void setStatusBarGradiant(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
Drawable background = activity.getResources().getDrawable(R.drawable.color_primary_gradient);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
window.setBackgroundDrawable(background);
}
}
private void loadFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, fragment);
transaction.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
if(menu instanceof MenuBuilder){
MenuBuilder m = (MenuBuilder) menu;
m.setOptionalIconsVisible(true);
}
final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
if (searchManager != null) {
final SearchView searchView = (SearchView) (menu.findItem(R.id.search)).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchView.clearFocus();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.length()>0){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("query", newText);
SearchMovieFragment searchMovieFragment = new SearchMovieFragment();
searchMovieFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.frame_container,searchMovieFragment).commit(); 
}
else {
loadFragment(new SearchMovieFragment());
}
return true;
}
});
}
return true;
}

}

和我的搜索电影片段

public class SearchMovieFragment extends Fragment {
private RecyclerView rvMovies;
private ArrayList<Movie> list = new ArrayList<>();
private CardViewMovieAdapter adapter;
private ProgressBar progressBar;
private String query;
public SearchMovieFragment() {
// Required empty public constructor
}
private Observer<ArrayList<Movie>> getListMovies = new Observer<ArrayList<Movie>>() {
@Override
public void onChanged(ArrayList<Movie> movies) {
if (movies != null) {
adapter.setData(movies);
}
else {
Toast.makeText(getContext(), R.string.no_result, Toast.LENGTH_LONG).show();
}
showLoading(false);
}
};
private static final String ARG_PARAM1 = "query";
public static SearchMovieFragment newInstance(String param1) {
SearchMovieFragment fragment = new SearchMovieFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
query = getArguments().getString("query");
return inflater.inflate(R.layout.fragment_movies, container, false);
}

public void onViewCreated(View view, Bundle savedInstanceState) {
rvMovies = view.findViewById(R.id.rv_movies);
rvMovies.setHasFixedSize(true);
progressBar = view.findViewById(R.id.progressBar);
MoviesViewModel moviesViewModel = ViewModelProviders.of(this).get(MoviesViewModel.class);
moviesViewModel.setSearchedMovie(query);
moviesViewModel.getMovie().observe(this, getListMovies);
showLoading(true);
showRecyclerCardView();
}
private void showRecyclerCardView() {
rvMovies.setLayoutManager(new LinearLayoutManager(this.getContext()));
adapter = new CardViewMovieAdapter(list);
rvMovies.setAdapter(adapter);
}

}

你可以尝试删除它吗?

private static final String ARG_PARAM1 = "query";
public static SearchMovieFragment newInstance(String param1) {
SearchMovieFragment fragment = new SearchMovieFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}

我希望它能与你合作

好吧,我对你的onQueryTextChange方法进行了如下更改。我能从您发布的内容中找出的唯一问题是这里loadFragment(new SearchMovieFragment());因为它会抛出 NPE,因为您没有将参数添加到这种情况的片段中,因此getArguments()将为空。

public boolean onQueryTextChange(String newText) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
SearchMovieFragment searchMovieFragment = new SearchMovieFragment();
Bundle bundle = new Bundle();
if(newText.length()>0) {
bundle.putString("query", newText);
} else {
bundle.putString("query", "");
}
searchMovieFragment.setArguments(bundle);
transaction.replace(R.id.frame_container,searchMovieFragment);
transaction.commit();
return true;
}

检查这是否有任何帮助,否则请确保没有其他地方在不添加参数的情况下创建此片段的实例。

来自活动:

Bundle bundle = new Bundle();
bundle.putString("value", "values From Activity");
// set SearchMovieFragment Arguments
SearchMovieFragment searchMovieFragment = new SearchMovieFragment();
searchMovieFragment.setArguments(bundle);

在你的Fragment on CreateView中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String strValue = getArguments().getString("value");    
return inflater.inflate(R.layout.fragment, container, false);
}

活动

您可以直接传递该值newInstance(value)

@Override
public boolean onQueryTextChange(String newText) {
if (newText.length()>0){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
SearchMovieFragment searchMovieFragment = new SearchMovieFragment.newInstance(newText);
transaction.replace(R.id.frame_container, searchMovieFragment);
transaction.commit();
} else {
loadFragment(new SearchMovieFragment.newInstance(""));   // pass blank string to avoid null exception in fragment
}

片段

在片段中创建newInstance

private static final String ARG_PARAM1 = "query";
public static SearchMovieFragment newInstance(String param1) {
SearchMovieFragment fragment = new SearchMovieFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String query = getArguments().getString(ARG_PARAM1);
MoviesViewModel moviesViewModel = ViewModelProviders.of(this).get(MoviesViewModel.class);
moviesViewModel.setSearchedMovie(query);
moviesViewModel.getMovie().observe(this, getListMovies);
return inflater.inflate(R.layout.fragment_movies, container, false);
}

最新更新