Java 无法从活动到片段获取捆绑包值
请帮忙,我刚刚学会了安卓,我正在尝试使用bundle将数据从我的主要活动发送到一个片段。这是MainActivity的代码Java 无法从活动到片段获取捆绑包值,java,android,android-fragments,bundle,Java,Android,Android Fragments,Bundle,请帮忙,我刚刚学会了安卓,我正在尝试使用bundle将数据从我的主要活动发送到一个片段。这是MainActivity的代码 @Override public boolean onQueryTextChange(String newText) { if (newText.length()>0){ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
@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();
}
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;
}
这是我片段的代码
@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.getStringquery;
错误是
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.os.Bundle.getStringjava.lang.String”
我怎样才能解决这个问题
这是我的主要活动
@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();
}
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);
}
}来自活动:
Bundle bundle = new Bundle();
bundle.putString("value", "values From Activity");
// set SearchMovieFragment Arguments
SearchMovieFragment searchMovieFragment = new SearchMovieFragment();
searchMovieFragment.setArguments(bundle);
在您的片段onCreateView中:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String strValue = getArguments().getString("value");
return inflater.inflate(R.layout.fragment, container, false);
}
活动
您可以直接在newInstancevalue中传递值
碎片
在片段中创建新实例
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);
}
你能试着删除这个吗
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方法做了如下更改。从你的帖子中我能看出的唯一问题是loadfragmentnewsearchmoviefragment;因为它会抛出一个NPE,因为在这种情况下,您没有将参数添加到片段中,因为getArguments将为null
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;
}
检查这是否有帮助,否则,请确保在没有添加参数的情况下,没有其他地方创建此片段的实例。在活动中还有其他地方提交SearchMovieFragment吗?您正在调用loadFragment而没有附件查询您是否可以从其他活动或片段转到SearchMovieFragment?是否创建了新实例方法?它不起作用,仍然导致字符串查询中出现NullPointerException=getArguments.getStringARG_PARAM1;有桌子吗?也许你的代码中还有其他错误,可能是你的片段调用了多次不,我不知道。你说碎片多次调用是什么意思?意思可能是你的碎片没有经过就调用了parameter@RobinLogstride您可以这样尝试:getSupportFragmentManager.beginTransaction.replaceR.id.frame\u容器,searchMovieFragment.commit;不幸的是,它仍然在字符串strValue=getArguments.getStringvalue中产生NullPointerException;