Android 如何将数据从MainActivy中的searchview传递到片段?
如何将数据从mainActivity中的searchview传递到片段?我在为一个糟糕的航空活动而大汗淋漓 已尝试:Android 如何将数据从MainActivy中的searchview传递到片段?,android,android-fragments,searchview,Android,Android Fragments,Searchview,如何将数据从mainActivity中的searchview传递到片段?我在为一个糟糕的航空活动而大汗淋漓 已尝试: @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_search, menu); MenuItem searchItem = menu.findItem
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_search, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Bundle bundle = new Bundle();
bundle.putString("teste", "123");
fragment2.setArguments(bundle);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return true;
}
片段:
Bundle bundle = this.getArguments();
if (bundle != null) {
String foo = getArguments().getString("teste");
Toast.makeText(getActivity().getApplicationContext(), foo, Toast.LENGTH_SHORT).show();
}
还有:
Bundle bundle = this.getArguments();
if (bundle != null) {
String foo = bundle.getString("teste");
Toast.makeText(getActivity().getApplicationContext(), foo,
Toast.LENGTH_SHORT).show();
}
和应用程序的工作。有人能帮我吗
添加片段:
Fragment currentFragment;
private home fragment1 = new home();
private clientes fragment2 = new clientes();
private contas_pagar fragment3 = new contas_pagar();
private BottomViewPagerAdapter bottomViewPagerAdapter;
private ArrayList<AHBottomNavigationItem> bottomNavigationItems = new ArrayList<>();
// UI
private AHBottomNavigationViewPager viewPagerBottom;
private AHBottomNavigation bottomNavigation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
}
private void initUI() {
bottomNavigation = (AHBottomNavigation) findViewById(R.id.bottom_navigation);
viewPagerBottom = (AHBottomNavigationViewPager) findViewById(R.id.view_pager_bottom);
//Aqui onde é adicionado os fragments no bottom
viewPagerBottom.setOffscreenPageLimit(2);
bottomViewPagerAdapter = new BottomViewPagerAdapter(getSupportFragmentManager());
bottomViewPagerAdapter.add(fragment1);
bottomViewPagerAdapter.add(fragment2);
bottomViewPagerAdapter.add(fragment3);
viewPagerBottom.setAdapter(bottomViewPagerAdapter);
currentFragment = bottomViewPagerAdapter.getCurrentFragment();
AHBottomNavigationItem item1 = new AHBottomNavigationItem("Home", R.drawable.ic_home_black_24dp);
AHBottomNavigationItem item2 = new AHBottomNavigationItem("Clientes", R.drawable.clientes);
AHBottomNavigationItem item3 = new AHBottomNavigationItem("Contas", R.drawable.pagar);;
bottomNavigationItems.add(item1);
bottomNavigationItems.add(item2);
bottomNavigationItems.add(item3);
bottomNavigation.addItems(bottomNavigationItems);
bottomNavigation.setAccentColor(Color.parseColor("#F63D2B"));
bottomNavigation.setInactiveColor(Color.parseColor("#747474"));
bottomNavigation.setCurrentItem(0);
//bottomNavigation.setNotification("Vencida", 2);
bottomNavigation.findViewById(R.id.textView18);
bottomNavigation.setOnTabSelectedListener(new AHBottomNavigation.OnTabSelectedListener() {
@Override
public boolean onTabSelected(int position, boolean wasSelected) {
if (currentFragment == null) {
currentFragment = bottomViewPagerAdapter.getCurrentFragment();
}
if (currentFragment != null) {
if (currentFragment instanceof home) {
fragment1.willBeHidden();
} else if (currentFragment instanceof clientes) {
fragment2.willBeHidden();
} else if (currentFragment instanceof contas_pagar) {
fragment3.willBeHidden();
}
}
//Aqui é onde é setado qual o fragment atual
//Em seguida é pego o fragment atual e feito o fade dependendo de qual instancia for
viewPagerBottom.setCurrentItem(position, false);
currentFragment = bottomViewPagerAdapter.getCurrentFragment();
if (currentFragment instanceof home) {
fragment1.willBeDisplayed();
} else if (currentFragment instanceof clientes) {
fragment2.willBeDisplayed();
} else if (currentFragment instanceof contas_pagar) {
fragment3.willBeDisplayed();
}
if (position == 0) {
}
return true;
}
});
bottomNavigation.setOnNavigationPositionListener(new AHBottomNavigation.OnNavigationPositionListener() {
@Override
public void onPositionChange(int y) {
Log.d("DemoActivity", "BottomNavigation Position: " + y);
}
});
}
适配器:
public class BottomViewPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments = new ArrayList<>();
private Fragment currentFragment;
public BottomViewPagerAdapter(FragmentManager fm) {
super(fm);
}
public void add(Fragment frag) {
this.fragments.add(frag);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object)
{
if (getCurrentFragment() != object) {
currentFragment = ((Fragment) object);
}
super.setPrimaryItem(container, position, object);
}
/**
* Get the current fragment
*/
public Fragment getCurrentFragment() {
return currentFragment;
}
}
日志:
02-14 13:50:07.435 12250-12250/insidetechnology.studio.ostdor.forbusiness E/AndroidRuntime:致命异常:main
流程:insidetechnology.studio.ostdor.forbusiness,PID:12250
java.lang.IllegalStateException:片段已处于活动状态
位于android.support.v4.app.Fragment.setArgumentsFragment.java:562
在insidetechnology.studio.ostdor.forbusiness.main活动$2.onquerytexsubmitmainactivity.java:196
位于android.support.v7.widget.SearchView.onSubmitQuerySearchView.java:1242
位于android.support.v7.widget.SearchView$9.onEditorActionSearchView.java:1219
在android.widget.TextView.onEditorActionTextView.java:4983
位于com.android.internal.widget.EditableInputConnection.PerformMeditorActionEditableInputConnection.java:145
在com.android.internal.view.IInputConnectionWrapper.ExecuteMessageInputConnectionWrapper.java:364
在com.android.internal.view.IInputConnectionWrapper$MyHandler.HandleMessageInputConnectionWrapper.java:91
在android.os.Handler.dispatchMessageHandler.java:110
在android.os.Looper.Looper.java:208
在android.app.ActivityThread.mainActivityThread.java:6267
在java.lang.reflect.Method.Invokenactive方法中
位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.runZygoteInit.java:1063
位于com.android.internal.os.ZygoteInit.mainZygoteInit.java:924
setArguments函数用于传递用于创建片段的数据。要与现有片段通信,只需调用自定义片段类本身的方法:
public boolean onQueryTextSubmit(String query) {
if (fragment2 instanceof clientes) {
((clientes)fragment2).setTestString("123");
}
}
您需要向fragment2添加方法setTestString,如下所示:
public void setTestString(String text) {
Toast.makeText(getActivity(), foo, Toast.LENGTH_SHORT).show();
}
实际上,其中有一篇很好的文章还介绍了如何将数据传递回活动。您可以通过创建接口回调在活动和片段之间进行通信。在onQueryTextSubmit中调用该回调,并在fragment中接收该值。您可以使用适配器使用getCurrentFragment,将其键入fragment2,并在希望传递字符串的位置调用public方法。该片段是否已可见?是的,我还添加了另一种获取数据的方法,您可以使用接口或事件总线在片段和活动之间进行通信。只需用谷歌搜索如何在活动和片段之间通信。@karandepsing我该怎么做?没有创建任何片段公共void setTestStringString testString{teste=testString;Toast.makeTextgetActivity.getApplicationContext,teste,Toast.LENGTH\u SHORT.show;}这取决于findFragmentById是否可以找到具有该id的片段。若您通过代码添加它,则可能需要使用findFragmentByTag。别忘了用我尝试过的标记添加它,但什么也没发生,它似乎总是空的,我没有检查它是否为空,应用程序在代码中停止工作,我使用的是BottonAvigationActivity,默认的Android Studio模板。你可能需要使用getFragmentManager。您正在使用FragmentStatePagerAdapter子类?我只能在方法是静态的情况下传递它,在获取字符串后,我需要调用另一个方法,因为这不是静态的,我如何在该静态中调用另一个?或者是p
可以在不保持静态的情况下通过吗?我尝试:public static void setTestStringContext context,String String{String teste;teste=String;new clients.buscarclient;Toast.makeTextcontext,teste,Toast.LENGTH_SHORT.show;}不,不需要是静态的。进一步你可以访问这个答案