【问题标题】:In A NavigationDrawer : How to get data from several fragments in another fragment?在 NavigationDrawer 中:如何从另一个片段中的多个片段中获取数据?
【发布时间】:2019-04-18 22:29:45
【问题描述】:

我正在开发一个应用程序来收集抽屉中的数据。 我有一个应用程序:
一项活动
一个带有 6 个片段的 NavigationDrawer

5 个 Fragment 中的每一个都包含 1 个 TextView 和 SPinner,我想从 Fragment 6 中的 Spinner 和 TextVieww 收集和显示数据。

实际上我想在每个片段中放置一个按钮,当我单击按钮时,数据将传递给片段 6。 所以我希望能够对每个 Fragment 执行此操作,并最终获取 Fragment 编号 6 中的所有数据,这将是所有数据的一种汇总。

如果你知道怎么做,那就太好了。

抽屉和所有 XML 都可以,我可以将单个数据从一个片段传递到另一个片段,但是当我想从另一个片段添加另一个数据时,应用程序崩溃。

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    /* ******* Déclaration des différents composants de l'appli : la Toolbar,
    le Drawer et le Navigation View **********************************  */

    private DrawerLayout drawer;
    private NavigationView navigationView;
    private Toolbar toolbar;

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

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        /* **** Concerne le FAB d'origine du modèle de GOOGLE **********
        *****************************************************************
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        */

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new IntroFragment()).commit();
            navigationView.setCheckedItem(R.id.nav_introduction);
        }
    }

    /* **** Referme le Drawer lorsqu'on clic sur le Hamburger *********
    ***************************************************************** */
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();


        //noinspection SimplifiableIfStatement
        /* ******* Desactivation du menu SETTING pour le moment ********
        if (id == R.id.action_settings) {
            return true;
        }*/

        return super.onOptionsItemSelected(item);
    }

    /* *** Gère l'affichage des Fragments dans le Drawer *********
    ************************************************************** */
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        // Gère les clics sur les panneaux dans le Drawer.
        switch (item.getItemId()) {
            case R.id.nav_introduction:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new IntroFragment()).commit();
                break;

            case R.id.nav_technicien:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new TechnicienFragment()).commit();
                break;

            case R.id.nav_dossier:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new DossierFragment()).commit();
                break;

            case R.id.nav_date:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new DateFragment()).commit();
                break;

            case R.id.nav_zone:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new ZoneFragment()).commit();
                break;

            case R.id.nav_intervention:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new InterventionFragment()).commit();
                break;

            case R.id.nav_photo:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new PhotoFragment()).commit();
                break;

            case R.id.nav_recapitulatif:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new RecapitulatifFragment()).commit();
                break;
        }

        int id = item.getItemId();

        if (id == R.id.nav_photo) {
            // Handle the camera action
        } else if (id == R.id.nav_introduction) {

        } else if (id == R.id.nav_technicien) {

        } else if (id == R.id.nav_dossier) {

        } else if (id == R.id.nav_date) {

        } else if (id == R.id.nav_zone) {

        } else if (id == R.id.nav_intervention) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

【问题讨论】:

  • 这不是您想要的方式,但无论如何,创建一个全局静态列表并为其添加值....再次,这并不理想
  • 如何在静态列表中添加来自不同片段的值?数据位于 5 个不同的片段上,我想在片段 6 中展示它们。
  • 制作一个静态列表 List list = new ....(),每次你在这些片段上打开/执行事务时,你都会将值添加到列表中。

标签: android


【解决方案1】:

不幸的是,片段之间不能直接访问,必须使用包含视图来回传输数据。我建议您检查这个预先存在且已回答的问题。 Passing data from one fragment to another

但主要的想法是你必须将数据传回主视图,当它得到它时,它会将它传递给另一个片段。

【讨论】:

  • 谢谢,它适用于单个 Fragment 是的,但是当我使用 Drawer 转到另一个 Fragment 并单击另一个 Fragment 上的按钮时,应用程序崩溃
  • 使用接口,在你的宿主活动中定义,并通过它进行通信
  • 为了更清楚,您将数据从片段传递到带有接口的主视图。你从主视图传递到带有额外意图的片段。
  • 谢谢你的答案,你怎么能定义这种接口?我在 Android 中对 Fragments 有点陌生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多