繁体   English   中英

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

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

如何将数据从mainActivity中的searchview传递到片段? 我正在为BottonNavigationActivity出汗。

已经尝试过:

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

logcat的:

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

setArguments()函数用于传递数据以创建片段。 要与现有的Fragments通信,您只需调用自定义Fragment类本身的方法即可:

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

Google的Android培训中实际上有一篇不错的文章,也描述了如何将数据传递回Activity。

您可以通过创建接口回调在活动和片段之间进行通信。 在onQueryTextSubmit中调用该回调,并在片段中接收该值。

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

暂无
暂无

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

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