Android 将数据从活动传递到已附加片段的方法
我一直在研究这个问题,尽管我找到了一些信息,但似乎有些细节我还没有掌握。我想将信息从一个活动传递到一个已经附加的片段。这是当前代码: SearchActivity.javaAndroid 将数据从活动传递到已附加片段的方法,android,android-fragments,android-activity,android-bundle,Android,Android Fragments,Android Activity,Android Bundle,我一直在研究这个问题,尽管我找到了一些信息,但似乎有些细节我还没有掌握。我想将信息从一个活动传递到一个已经附加的片段。这是当前代码: SearchActivity.java public class SearchActivity extends AppCompatActivity { private static final int FRAG_USERS = 0; private static final int FRAG_MESSAGES = 1; private i
public class SearchActivity extends AppCompatActivity {
private static final int FRAG_USERS = 0;
private static final int FRAG_MESSAGES = 1;
private int currentFrag = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
ViewPager2 searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
} case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
currentFrag = searchTL.getSelectedTabPosition();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
//SearchUserFragment.newInstance(query);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
});
return true;
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
public class SearchPagerAdapter extends FragmentStateAdapter {
public SearchPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return new SearchUserFragment();
} else {
return new SearchMessageFragment();
}
}
@Override
public int getItemCount() {
return 2;
}
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_search_message, container, false);
notFoundTV = view.findViewById(R.id.notFoundTV);
searchTipCV = view.findViewById(R.id.searchTipCV);
refreshRV(view);
Bundle bundle = this.getArguments();
if (bundle != null) {
searchUser(bundle.getString(BUNDLE_SEARCH));
}
return view;
}
public class SearchActivity extends AppCompatActivity {
private ViewPager2 searchVP2;
private String globalQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
}
case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
searchInCurrentFrag(globalQuery, tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
globalQuery = query;
if (!TextUtils.isEmpty(query)) {
searchInCurrentFrag(query, searchVP2.getCurrentItem());
}
return true;
}
});
return true;
}
private void searchInCurrentFrag(String query, int position) {
if (query != null) {
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag("f" + position);
if (currentFragment instanceof SearchUserFragment) {
((SearchUserFragment) currentFragment).searchUser(query);
} else {
((SearchMessageFragment) currentFragment).searchMessage(query);
}
}
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
SearchUserFragment.java(消息片段在这方面是相同的)
我不明白为什么我在研究过程中发现的一些newInstance()方法会返回片段本身。我已经在SearchUserFragment中尝试了以下方法:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null && getArguments().containsKey(BUNDLE_SEARCH)) {
searchUser(savedInstanceState.getString(BUNDLE_SEARCH));
}
}
public static SearchUserFragment newInstance(String query) {
SearchUserFragment searchUserFragment = new SearchUserFragment();
Bundle args = new Bundle();
args.putString(BUNDLE_SEARCH, query);
searchUserFragment.setArguments(args);
return searchUserFragment;
}
但它没有成功,就像newInstance()没有实例化片段的另一个实例一样。应用程序没有崩溃,但当我在SearchView中键入内容时不会发生任何事情
我也尝试过这样做:
SearchActivity.java
public class SearchActivity extends AppCompatActivity {
private static final int FRAG_USERS = 0;
private static final int FRAG_MESSAGES = 1;
private int currentFrag = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
ViewPager2 searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
} case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
currentFrag = searchTL.getSelectedTabPosition();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
//SearchUserFragment.newInstance(query);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
});
return true;
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
public class SearchPagerAdapter extends FragmentStateAdapter {
public SearchPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return new SearchUserFragment();
} else {
return new SearchMessageFragment();
}
}
@Override
public int getItemCount() {
return 2;
}
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_search_message, container, false);
notFoundTV = view.findViewById(R.id.notFoundTV);
searchTipCV = view.findViewById(R.id.searchTipCV);
refreshRV(view);
Bundle bundle = this.getArguments();
if (bundle != null) {
searchUser(bundle.getString(BUNDLE_SEARCH));
}
return view;
}
public class SearchActivity extends AppCompatActivity {
private ViewPager2 searchVP2;
private String globalQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
}
case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
searchInCurrentFrag(globalQuery, tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
globalQuery = query;
if (!TextUtils.isEmpty(query)) {
searchInCurrentFrag(query, searchVP2.getCurrentItem());
}
return true;
}
});
return true;
}
private void searchInCurrentFrag(String query, int position) {
if (query != null) {
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag("f" + position);
if (currentFragment instanceof SearchUserFragment) {
((SearchUserFragment) currentFragment).searchUser(query);
} else {
((SearchMessageFragment) currentFragment).searchMessage(query);
}
}
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
SearchUserFragment.java
public class SearchActivity extends AppCompatActivity {
private static final int FRAG_USERS = 0;
private static final int FRAG_MESSAGES = 1;
private int currentFrag = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
ViewPager2 searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
} case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
currentFrag = searchTL.getSelectedTabPosition();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
//SearchUserFragment.newInstance(query);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
});
return true;
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
public class SearchPagerAdapter extends FragmentStateAdapter {
public SearchPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return new SearchUserFragment();
} else {
return new SearchMessageFragment();
}
}
@Override
public int getItemCount() {
return 2;
}
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_search_message, container, false);
notFoundTV = view.findViewById(R.id.notFoundTV);
searchTipCV = view.findViewById(R.id.searchTipCV);
refreshRV(view);
Bundle bundle = this.getArguments();
if (bundle != null) {
searchUser(bundle.getString(BUNDLE_SEARCH));
}
return view;
}
public class SearchActivity extends AppCompatActivity {
private ViewPager2 searchVP2;
private String globalQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
}
case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
searchInCurrentFrag(globalQuery, tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
globalQuery = query;
if (!TextUtils.isEmpty(query)) {
searchInCurrentFrag(query, searchVP2.getCurrentItem());
}
return true;
}
});
return true;
}
private void searchInCurrentFrag(String query, int position) {
if (query != null) {
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag("f" + position);
if (currentFragment instanceof SearchUserFragment) {
((SearchUserFragment) currentFragment).searchUser(query);
} else {
((SearchMessageFragment) currentFragment).searchMessage(query);
}
}
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
也没有成功。与上述行为相同
在代码的当前状态下,我得到了NullPointerException(这是理所当然的)。当前代码使所有我的列表和视图都变为null,因为onCreateView()由于已创建而未被触发
我只想能够从SearchActivity获取查询,以便从片段中完美地执行searchUser()/searchMessage()。多亏@DanielNugent发布的最后一个链接,我已经能够解决这个问题 SearchUserFragment.java
public class SearchActivity extends AppCompatActivity {
private static final int FRAG_USERS = 0;
private static final int FRAG_MESSAGES = 1;
private int currentFrag = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
ViewPager2 searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
} case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
currentFrag = searchTL.getSelectedTabPosition();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
//SearchUserFragment.newInstance(query);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
});
return true;
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
public class SearchPagerAdapter extends FragmentStateAdapter {
public SearchPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return new SearchUserFragment();
} else {
return new SearchMessageFragment();
}
}
@Override
public int getItemCount() {
return 2;
}
}
@Override
public boolean onQueryTextChange(String query) {
if (!TextUtils.isEmpty(query)) {
if (currentFrag == FRAG_USERS) {
Bundle bundle = new Bundle();
bundle.putString(Constants.BUNDLE_SEARCH, query);
new SearchUserFragment().setArguments(bundle);
} else {
SearchMessageFragment.newInstance(query);
}
}
return true;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_search_message, container, false);
notFoundTV = view.findViewById(R.id.notFoundTV);
searchTipCV = view.findViewById(R.id.searchTipCV);
refreshRV(view);
Bundle bundle = this.getArguments();
if (bundle != null) {
searchUser(bundle.getString(BUNDLE_SEARCH));
}
return view;
}
public class SearchActivity extends AppCompatActivity {
private ViewPager2 searchVP2;
private String globalQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
setupActionBar();
setupViewPager();
}
private void setupActionBar() {
ActionBar actionBar = this.getSupportActionBar();
actionBar.setTitle("");
actionBar.setDisplayHomeAsUpEnabled(true);
}
private void setupViewPager() {
searchVP2 = findViewById(R.id.searchVP2);
searchVP2.setAdapter(new SearchPagerAdapter(this));
TabLayout searchTL = findViewById(R.id.searchTL);
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(searchTL, searchVP2, (tab, position) -> {
switch (position) {
case 0: {
tab.setText(R.string.users);
break;
}
case 1: {
tab.setText(R.string.messages);
break;
}
}
});
tabLayoutMediator.attach();
searchTL.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
searchInCurrentFrag(globalQuery, tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_searchable, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchIT).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconified(false);
searchView.setFocusable(true);
searchView.requestFocusFromTouch();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String query) {
globalQuery = query;
if (!TextUtils.isEmpty(query)) {
searchInCurrentFrag(query, searchVP2.getCurrentItem());
}
return true;
}
});
return true;
}
private void searchInCurrentFrag(String query, int position) {
if (query != null) {
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag("f" + position);
if (currentFragment instanceof SearchUserFragment) {
((SearchUserFragment) currentFragment).searchUser(query);
} else {
((SearchMessageFragment) currentFragment).searchMessage(query);
}
}
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
这可能会有所帮助,您基本上需要对现有片段的引用,并且您可以直接调用该方法,无需绑定:@DanielNugent我需要为ViewPager2设置适配器吗?我已经更改了SearchPagerAdapter的代码,但我不确定如何处理SearchActivity上的setupViewPager()。当我尝试设置它时,它给了我一个错误,因为SearchPager类从FragmentPagerAdapter扩展而不是从FragmentStateAdapter扩展。请看这里的答案:@DanielNugent上一个链接就是我要找的。非常感谢:)