Android 如何将数据从MainActivy中的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

如何将数据从mainActivity中的searchview传递到片段?我在为一个糟糕的航空活动而大汗淋漓

已尝试:

@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;}不,不需要是静态的。进一步你可以访问这个答案