यह मेरा पहली बार टुकड़ों का उपयोग कर रहा है और मैंने एक नया प्रोजेक्ट बनाना शुरू कर दिया है और एंड्रॉइड स्टूडियो में "नेविगेशन ड्रॉअर गतिविधि" चुनना शुरू कर दिया है। मेरा पहला कदम 'content_main.xml' (नीचे दिखाया गया) में दूसरा टुकड़ा जोड़ना था और MainActivity.java में मूल nav_host के संदर्भों को बाएं टुकड़े में अपडेट करना था।

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/app_bar_main">

    <fragment
        android:id="@+id/nav_host_fragment_left"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintEnd_toStartOf="@+id/guideline"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />

    <fragment
        android:id="@+id/nav_host_fragment_right"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/guideline"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.50121653" />
</androidx.constraintlayout.widget.ConstraintLayout>

नीचे MainActivity.Java . है

package com.example.test;

import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import android.view.View;

import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

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

import androidx.drawerlayout.widget.DrawerLayout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.Menu;

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = 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();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
                R.id.nav_tools, R.id.nav_share, R.id.nav_send)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_left);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);


    }

    @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 onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_left);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}

जब मैं ऐप चलाता हूं तो मुझे दोनों तरफ "यह घर का टुकड़ा है" दिखाई देता है। मैं एक अन्य मेनू विकल्प का चयन करने के लिए मेनू का उपयोग कर सकता हूं, और बाईं ओर नया टुकड़ा प्रदर्शित करने के लिए बदल जाता है, और दायां अभी भी घर दिखा रहा है। मेरी समस्या तब है जब मैं दो टुकड़ों के बीच संवाद करने की कोशिश करना शुरू करता हूं। मैं नीचे दिए गए उदाहरण को देख रहा था:

https://codinginflow.com/tutorials/android/fragment-to-fragment-communication-with-interfaces

हालाँकि उनकी MainActivity में नीचे दिया गया कोड है

fragmentA = new FragmentA();
fragmentB = new FragmentB();
getSupportFragmentManager().beginTransaction()
      .replace(R.id.container_a, fragmentA)
      .replace(R.id.container_b, fragmentB)
      .commit();

मैं इसे अपनी वर्तमान मुख्य गतिविधि में नहीं देखता, बस कुछ NavController आइटम जो मुझे लगता है कि किसी तरह इसी तरह से काम कर रहे हैं।

तो मेरे पास 2 प्रश्न हैं:

Q1 - जब मैं मेनू आइटम पर क्लिक करता हूं तो नमूना प्रोजेक्ट बाईं ओर के टुकड़े को कैसे बदल रहा है?

Q2 - मैं MainActivity से दाईं ओर के टुकड़े के साथ कैसे संवाद कर सकता हूं? मैं सोच रहा हूं कि मुझे MainActivity OnCreate() में findFragmentById का उपयोग करने में सक्षम होना चाहिए, लेकिन यह काम नहीं करता है।

HomeFragment homeFrag = getSupportFragmentManager().findFragmentById(R.id.nav_host_frag_right);

मैं अनुमान लगा रहा हूं कि मुझे टुकड़े बनाने के तरीके को संशोधित करने की आवश्यकता है? किसी भी प्रकार की मदद की बेहद सराहना की जाती है!

0
Elmer 6 अक्टूबर 2020, 01:34

1 उत्तर

सबसे बढ़िया उत्तर

आप या तो व्यूमोडेल क्लास का उपयोग कर सकते हैं जिससे टुकड़े आसानी से संवाद कर सकते हैं और यह एक मध्यस्थ के रूप में कार्य करेगा या आप एक इंटरफ़ेस बना सकते हैं जो आपकी गतिविधि में लागू हो। टुकड़े सीधे बातचीत नहीं कर सकते हैं। https://developer.android.com/reference/androidx/lifecycle/ViewModel https://developer.android.com/training/basics/fragments/communicating

आप उन इंटरफ़ेस विधियों को दूसरे मामले में कुछ इस तरह से कॉल कर सकते हैं:

   (getActivity)ac.methodA() ac is a reference variable of interface and methods() is 
   one of the methods of interface.
0
Ruben Helsloot 26 अक्टूबर 2020, 01:42