简体   繁体   English

如何将数据从mainAcitivy中的searchview传递到片段?

[英]How to pass data from a searchview that is in mainAcitivy, to a fragment?

How to pass data from a searchview that is in mainActivity, to a fragment? 如何将数据从mainActivity中的searchview传递到片段? I'm sweating a BottonNavigationActivity. 我正在为BottonNavigationActivity出汗。

Already tried: 已经尝试过:

@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;
}

in Fragment: 在片段中:

 Bundle bundle = this.getArguments();

    if (bundle != null) {
        String foo = getArguments().getString("teste");

        Toast.makeText(getActivity().getApplicationContext(), foo, Toast.LENGTH_SHORT).show();
    }

and too: 还有:

Bundle bundle = this.getArguments();
if (bundle != null) {
        String foo = bundle.getString("teste");

        Toast.makeText(getActivity().getApplicationContext(), foo, 
Toast.LENGTH_SHORT).show();
    }

And the app to work. 和应用程序一起工作。 can anybody help me? 有谁能够帮助我?

adding fragment: 添加片段:

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

Adapter: 适配器:

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;
}
}

Logcat: logcat的:

02-14 13:50:07.435 12250-12250/insidetechnology.studio.ostdor.forbusiness E/AndroidRuntime: FATAL EXCEPTION: main Process: insidetechnology.studio.ostdor.forbusiness, PID: 12250 java.lang.IllegalStateException: Fragment already active at android.support.v4.app.Fragment.setArguments(Fragment.java:562) at insidetechnology.studio.ostdor.forbusiness.MainActivity$2.onQueryTextSubmit(MainActivity.java:196) at android.support.v7.widget.SearchView.onSubmitQuery(SearchView.java:1242) at android.support.v7.widget.SearchView$9.onEditorAction(SearchView.java:1219) at android.widget.TextView.onEditorAction(TextView.java:4983) at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:145) at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:364) at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:91) at android.os.Handler.dispatchMessage(Handler.java:110) at 02-14 13:50:07.435 12250-12250 / insidetechnology.studio.ostdor.forbusiness E / AndroidRuntime:致命例外:主进程:insidetechnology.studio.ostdor.forbusiness,PID:12250 java.lang.IllegalStateException:片段已在以下位置激活内部技术.studio.ostdor.forbusiness.MainActivity $ 2.onQueryTextSubmit(MainActivity.java:196)中的android.support.v4.app.Fragment.setArguments(Fragment.java:562)在android.support.v7.widget.SearchView.onSubmitQuery (SearchView.java:1242)在android.support.v7.widget.SearchView $ 9.onEditorAction(SearchView.java:1219)在android.widget.TextView.onEditorAction(TextView.java:4983)在com.android.internal.widget com.android.internal.view.IInputConnectionWrapper.java:364的com.android.internal.view.IInputConnectionWrapper $ MyHandler.handleMessage(IInputConnectionWrapper.java:91的.EditableInputConnection.performEditorAction(EditableInputConnection.java:145) ),位于android.os.Handler.dispatchMessage(Handler.java:110) android.os.Looper.loop(Looper.java:208) at android.app.ActivityThread.main(ActivityThread.java:6267) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) com.android.internal的java.lang.reflect.Method.invoke(Native Method)的android.app.ActivityThread.main(ActivityThread.java:6267)的android.os.Looper.loop(Looper.java:208) os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1063)位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

The setArguments() function is used to pass data for the creation of Fragments. setArguments()函数用于传递数据以创建片段。 To communicate with existing Fragments, you would just call a method of your custom Fragment class itself: 要与现有的Fragments通信,您只需调用自定义Fragment类本身的方法即可:

public boolean onQueryTextSubmit(String query) {
    if (fragment2 instanceof clientes) { 
        ((clientes)fragment2).setTestString("123");
    }
}

You need to add a method setTestString to your fragment2 like this: 您需要像这样在您的fragment2添加方法setTestString

public void setTestString(String text) {
    Toast.makeText(getActivity(), foo, Toast.LENGTH_SHORT).show();
}

There's actually a good article in Google's Android Training that also describes how to pass data back to the Activity. Google的Android培训中实际上有一篇不错的文章,也描述了如何将数据传递回Activity。

You can communicate between activity and fragment by creating an interface callback. 您可以通过创建接口回调在活动和片段之间进行通信。 Invoke that callback in onQueryTextSubmit and recieve that value in fragment. 在onQueryTextSubmit中调用该回调,并在片段中接收该值。

您可以使用适配器使用getCurrentFragment() ,将其类型转换为fragment2,然后在要传递字符串的位置调用public方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM