繁体   English   中英

Android Studio 如何在使用导航视图时将数据从片段传递到片段?

[英]Android Studio How do I pass data from fragment to fragment when a navigation view is being used?

所以我正在使用导航视图,我试图了解如何将数据从片段传递到片段。 我问这个是因为我从来没有一个地方可以对主要活动中的任何片段或片段之间的任何片段进行引用。 这是主要活动的代码:

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.widget.Toast;

import com.google.android.material.navigation.NavigationView;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {


    private DrawerLayout drawer;


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



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

        drawer = findViewById(R.id.drawer_layout);
        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.fragmentHolder,
                    new Fragment1()).commit();
            navigationView.setCheckedItem(R.id.nav_frag1);

        }

    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        switch (menuItem.getItemId()) {
            case R.id.nav_frag1:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragmentHolder,
                        new Fragment1()).commit();

                break;
            case R.id.nav_frag2:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragmentHolder,
                        new frag2()).commit();

                break;
            case R.id.nav_frag3:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragmentHolder,
                        new Fragment3()).commit();

                break;

            case R.id.nav_action1:

                    getSupportFragmentManager().findFragmentById(R.id.fragmentHolder).setArguments(bundle);
                } else {

                }
        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }


}

我曾尝试使用捆绑包,但似乎无法获得对我正在尝试访问的碎片的引用。 我还试图弄清楚如何让 action_1 将一个布尔值传递给片段 1。我也尝试过使用接口,但这对我也不起作用。 我很新,所以我希望有办法做到这一点。 有什么建议? 谢谢!

您可以声明并实例化一个 ViewModel 类(或者实际上不止一个),该类与容纳您的 Fragment 的 FragmentActivity 范围相关联。

    model = activity?.run { ViewModelProviders.of(this)[SharedViewModel::class.java]

如果您在 Fragment 中执行相同操作并假设您传递的参数与包含 Fragment 的 FragmentActivity 相同,那么您将获得相同的 ViewModel 实例。 由于 ViewModel 实例在 Activity 和 Fragment 之间共享,因此您可以使用它在它们之间传递数据。 由于它是一个自定义类,它只是扩展了 ViewModel,您可以在其中存储您需要的任何内容。

这是官方文档的链接: https : //developer.android.com/topic/libraries/architecture/viewmodel#sharing

暂无
暂无

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

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