Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从活动到片段获取捆绑包值_Java_Android_Android Fragments_Bundle - Fatal编程技术网

Java 无法从活动到片段获取捆绑包值

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();

请帮忙,我刚刚学会了安卓,我正在尝试使用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();
     }
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;