簡體   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