将数据从活动传递到底部导航栏的片段

Posted

技术标签:

【中文标题】将数据从活动传递到底部导航栏的片段【英文标题】:passing data from from an activiy to a fragment withn bottom navigation bar 【发布时间】:2019-12-29 05:42:50 【问题描述】:

我创建了一个应用程序,其底部导航栏由 5 个片段组成。第二个片段(搜索片段)由 1 个带有 setOnClickListener 的 TextView 组成,因此一旦它被舔,布局活动将在顶部打开,其中包括一个 ListView允许用户选择/单击特定项目,因此稍后此选定项目信息应显示在(搜索片段)内的该 TextView 上。

我尝试使用 Bundle 从其中传递数据,但它不起作用。

--------------主活动-------- --------------------

public class MainActivity extends AppCompatActivity 



final Fragment f1 = new HomeFragment();
final Fragment f2 = new SearchFragment();
final Fragment f3 = new CameraFragment();
final Fragment f4 = new ChatFragment();
final Fragment f6 = new LogginFragment();

final FragmentManager fm = getSupportFragmentManager();
Fragment active = f1;



@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //the fragment
    BottomNavigationViewEx bnve = (BottomNavigationViewEx) findViewById(R.id.bottom_navigation);

    bnve.enableAnimation(false);
    bnve.enableShiftingMode(false);
    bnve.enableItemShiftingMode(false);
    bnve.setOnNavigationItemSelectedListener(navListener);


    fm.beginTransaction().add(R.id.fragment_container, f6, "6").hide(f6).commit();
    //fm.beginTransaction().add(R.id.fragment_container, f5, "5").hide(f5).commit();
    fm.beginTransaction().add(R.id.fragment_container, f4, "4").hide(f4).commit();
    fm.beginTransaction().add(R.id.fragment_container, f3, "3").hide(f3).commit();
    fm.beginTransaction().add(R.id.fragment_container, f2, "2").hide(f2).commit();
    fm.beginTransaction().add(R.id.fragment_container, f1, "1").commit();




   public void MovetoSuccess()

       startActivity(new Intent(this,SuccessActivity.class));
   

  public void MovetoCategoiry()

    startActivity(new Intent(this,Categories_Activity.class));



public BottomNavigationViewEx.OnNavigationItemSelectedListener navListener =
        new BottomNavigationViewEx.OnNavigationItemSelectedListener() 
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) 
                switch (item.getItemId()) 

                    case R.id.nav_home:
                        fm.beginTransaction().hide(active).show(f1).commit();
                        active = f1;
                        return true;

                    case R.id.nav_search:
                        fm.beginTransaction().hide(active).show(f2).commit();
                        active = f2;
                        return true;
                    case R.id.nav_camera:
                        fm.beginTransaction().hide(active).show(f3).commit();
                        active = f3;
                        return true;
                    case R.id.nav_chat:
                        fm.beginTransaction().hide(active).show(f4).commit();
                        active = f4;
                        return true;
                    case R.id.nav_account:
                            fm.beginTransaction().hide(active).show(f6).commit();
                            active = f6;
                            return true;

                



                return false;

            
        ;




  

-------------- ---SearchFragment ----- ----------------

 public class SearchFragment extends Fragment  


TextView Categories;


static boolean status = false;
String SelectedItem;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 

    View v = inflater.inflate(R.layout.fragment_search,container,false);


    Categories = (TextView) v.findViewById(R.id.categories);

     Bundle bundle = this.getArguments();

          if (bundle != null)

        String SelectedItem = bundle.getString("ss");
        Categories.setText(SelectedItem);
    


    Categories.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            ((MainActivity)getActivity()).MovetoCategoiry();

        
    );



    return v;


public Boolean getifItemselected(Boolean status)
    this.status=status;
    return true;

    


 

--------------Categories_Activity-------- -------------

public class Categories_Activity extends AppCompatActivity implements View.OnClickListener 

ImageView BacktoMainPage;
ListView subCate;
public String selectedItem;



@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab_subcategory);
    subCate = (ListView)findViewById(R.id.listview_subcate);
    BacktoMainPage = (ImageView)findViewById(R.id.BacktoMain);
    BacktoMainPage.setOnClickListener(this);
    final SearchFragment sf = new SearchFragment();

    subCate.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
             selectedItem = String.valueOf(parent.getItemAtPosition(position));

            Bundle bundle = new Bundle();
            bundle.putString("ss",selectedItem);
            sf.setArguments(bundle);

            finish();

        
    );

 


@Override
public void onClick(View v) 

    if (v == BacktoMainPage)
        finish();

         


  

【问题讨论】:

【参考方案1】:

尝试使用这样的单例

public class DataHolder 
//design pattern to share arguments between fragments and activities
private static DataHolder dataHolder = null;

private DataHolder() 


public static DataHolder getInstance() 
    if (dataHolder == null)
    
        dataHolder = new DataHolder();
    
    return dataHolder;



private  String item;

public String getItem() 
    return item;


public void setItem(String item) 
    this.item = item;

所以要保存你的项目使用:

DataHolder.getInstance().setItem(selectedItem);

并访问您的数据使用:

DataHolder.getInstance().getItem();

这可以帮助您在片段和活动之间传输数据

【讨论】:

非常感谢它确实有效,但我需要调用 MainActivity 类来刷新所有片段,所以我使用了这个代码 Intent = new Intent(Categories_Activity.this,MainActivity.class); startActivity(in); 我有一个问题是有什么办法只刷新那个搜索片段 我想我没有得到你的问题你能具体说明你的需求吗? 我的意思是,在我调用 DataHolder.getInstance.getItem 方法将所选项目从列表视图放到该搜索片段内的 Textview 字段之后,除非我调用 MainActivity (开始 onCreat meth) 因此它由包含所有片段的底部导航栏组成,因此片段将被刷新。所以我的问题是有没有办法在不调用 MainActivity 的情况下刷新该搜索片段【参考方案2】:

如果用户单击listview的项目,您可以使用静态列表,您可以将其添加到列表中并使用此列表的任何片段,或者创建一个setter getter的公共类来设置和获取值。

【讨论】:

我按照你说的尝试使用带有 setter 和 getter 的公共类,但它不起作用,因为需要刷新搜索片段!。 所以试试公共静态列表 因为它将包含您关闭应用程序和刷新片段时的值然后清除列表。 能否给我看一个代码示例,因为我真的没明白

以上是关于将数据从活动传递到底部导航栏的片段的主要内容,如果未能解决你的问题,请参考以下文章

底部导航栏的 Oncreate 视图问题

如何为导航到实现底部导航栏的活动中的上一个片段进行后推操作?

带有片段和底部导航栏的 Android FloatingActionButton

如何将地图活动添加到底部导航?

如何在更改全屏/上方导航时使用导航组件 navhostfragment

底部导航图标不变