ส่วนประกอบสถาปัตยกรรมการนำทาง Android - รับส่วนที่มองเห็นได้ในปัจจุบัน


95

ก่อนที่จะลองใช้ส่วนประกอบการนำทางฉันเคยทำธุรกรรมแฟรกเมนต์ด้วยตนเองและใช้แท็กแฟรกเมนต์เพื่อดึงแฟรกเมนต์ปัจจุบัน

val fragment:MyFragment = supportFragmentManager.findFragmentByTag(tag):MyFragment

ตอนนี้ในรูปแบบกิจกรรมหลักของฉันฉันมีสิ่งที่ต้องการ:

<fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host"
        app:navGraph= "@navigation/nav_item"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost= "true"
        />

ฉันจะดึงแฟรกเมนต์ที่แสดงปัจจุบันโดยคอมโพเนนต์การนำทางได้อย่างไร กำลังทำ

supportFragmentManager.findFragmentById(R.id.nav_host)

คืนค่า a NavHostFragmentและฉันต้องการดึงข้อมูล 'MyFragment' ที่แสดง

ขอบคุณ.


4
ไม่มีวิธีใดในการดึงส่วนที่เป็นปัจจุบันstackoverflow.com/a/50689587/1268507 คุณกำลังพยายามทำอะไรอยู่ อาจมีวิธีแก้ปัญหาอื่น ๆ
Alex

ฉันต้องการชิ้นส่วนของฉันเพื่อเริ่มจุดประสงค์ของกล้องถ่ายรูปและใช้ภาพที่ถ่าย ในการทำเช่นนั้นฉันได้เริ่มกิจกรรมและรอผลในonActivityResultกิจกรรมหลักของฉัน เนื่องจากฉันไม่สามารถรับชิ้นส่วนได้ฉันจึงย้ายทั้งหมดนี้ไปไว้ในส่วนของตัวเองและดูเหมือนว่าจะได้ผล
Alin

คุณต้องการดำเนินการกับออบเจ็กต์แฟรกเมนต์นั้นหรือไม่ หรือแค่คุณต้องการให้ส่วนไหนแสดง?
Ranjan

คำตอบ:


101

ฉันได้ค้นพบวิธีในตอนนี้และเป็นดังนี้:

NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host);
navHostFragment.getChildFragmentManager().getFragments().get(0);

ในกรณีที่คุณรู้ว่าเป็นชิ้นส่วนแรก ฉันยังคงตรวจสอบวิธีที่ไม่มีสิ่งนี้ ฉันยอมรับว่ามันไม่ใช่วิธีที่ดีที่สุด แต่ควรจะเป็นตอนนี้


6
เป็นเรื่องดีที่ได้เห็นโซลูชันที่ใช้ได้ผล ฉันยอมแพ้กับสิ่งนี้และเริ่มใช้ viewModel ที่ใช้ร่วมกันระหว่างกิจกรรมและแฟรกเมนต์ซึ่งหมายความว่าฉันสามารถส่งต่อเหตุการณ์ระหว่างกันได้โดยไม่ต้องมีการเรียกกลับหรือการเข้าถึงโดยตรง
Alin

ดังที่กล่าวไว้ในรายงานข้อบกพร่องนี้Issetracker.google.com/issues/119800853นี่ไม่ใช่วิธีการที่ถูกต้องในการดำเนินการ โปรดพิจารณาเปลี่ยนคำตอบที่ถูกต้อง!
Nicolas Pietri

2
ตามที่กล่าวไว้ไม่ใช่วิธีแก้ปัญหา แต่เป็นวิธีแก้ปัญหาจนกว่าจะพบวิธีแก้ปัญหาที่เหมาะสม
Andrei Toader

1
ได้ผลขอบคุณมาก ฉันลอง getPrimaryNavigationFragment () ตามที่แนะนำในตัวติดตามข้อบกพร่อง แต่มันไม่ได้งานทำ
Jerry Hu

1
จากโซลูชันนี้ฉันได้สร้างฟังก์ชัน kotlin ที่สามารถตรวจสอบว่าส่วนปัจจุบันเป็นประเภทเฉพาะหรือไม่ (แทนที่จะเป็น id): navHostFragment!!.childFragmentManager.fragments.any { it.javaClass == fragmentClass && it.isVisible }ทำงานได้ค่อนข้างคล้ายกัน หวังว่ามันจะช่วยทุกคน!
P Kuijpers

49

ไม่มีวิธีใดที่ฉันสามารถค้นหาเพื่อดึงอินสแตนซ์แฟรกเมนต์ปัจจุบันได้ อย่างไรก็ตามคุณสามารถรับ ID ของส่วนที่เพิ่มล่าสุดได้โดยใช้รหัสด้านล่าง

navController.currentDestination?.getId()

ส่งคืน ID ในไฟล์การนำทาง หวังว่านี่จะช่วยได้


ขอบคุณสำหรับคำตอบ. ฉันจำเป็นต้องดึงชิ้นส่วนเพื่อที่ฉันจะได้โต้ตอบกับมัน เนื่องจาก navController ไม่สามารถส่งคืนได้ฉันจึงใช้ Viewmodel ที่ใช้ร่วมกันเพื่อพูดคุยระหว่างกิจกรรมและส่วนย่อย
Alin

7
ฉันคาดว่า id ที่ส่งคืนจะตรงกับ id ใน nav xml แต่ไม่เป็นเช่นนั้นดังนั้นคุณไม่สามารถตรวจสอบ navController.getCurrentDestination () ได้ getId () == R.id.myfrag
Leres Aldtai

4
@LeresAldtai ตรงกับ ID ของแฟรกเมนต์ในไฟล์การนำทาง
slhddn

1
ขอบคุณ @slhddn. ความคิดเห็นของคุณช่วยฉันและสามารถดึงรหัสจากส่วนและทำให้งานนี้ได้ เพิ่มคำตอบที่นี่พร้อมรหัสของฉันในกรณีที่เป็นประโยชน์กับคนอื่น ไชโย
Francislainy Campos

31

คุณควรดูคุณสมบัติ childFragmentManager primaryNavigationFragment ของส่วน nav ของคุณซึ่งเป็นที่อ้างอิงแฟรกเมนต์ที่แสดงในปัจจุบัน

val navHost = supportFragmentManager.findFragmentById(R.id.main_nav_fragment)
    navHost?.let { navFragment ->
        navFragment.childFragmentManager.primaryNavigationFragment?.let {fragment->
                //DO YOUR STUFF
        }
    }
}

2
ตอนนี้วิธีนี้ได้รับการบันทึกไว้ใน fragmentManager issueetracker.google.com/issues/119800853
Nicolas Pietri

ดูเหมือนจะเป็นปัญหาเล็กน้อย การจัดการการนำทางฉันต้องตั้งค่าแถบการดำเนินการเพื่อเรียกใช้ onSupportNaigateUp ()
filthy_wizard

18

นี่เป็นวิธีที่สะอาดที่สุด อัปเดต:เปลี่ยนฟังก์ชันส่วนขยายเป็นคุณสมบัติ ขอบคุณอิกอร์ Wojda

1. สร้างส่วนขยายต่อไปนี้

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager

val FragmentManager.currentNavigationFragment: Fragment?
    get() = primaryNavigationFragment?.childFragmentManager?.fragments?.first()

2. ActivityมีNavHostFragmentการใช้งานเช่นนี้

val currentFragment = supportFragmentManager.currentNavigationFragment

2
ดี - หนึ่งที่ฉันจะเปลี่ยน - ฉันจะกำหนดส่วนขยายเป็นคุณสมบัติFragmentManager.currentNavigationFragment(ไม่ใช่ฟังก์ชัน)
Igor Wojda

16

ใช้addOnDestinationChangedListenerในกิจกรรมที่มีNavHostFragment

สำหรับ Java

 NavController navController= Navigation.findNavController(MainActivity.this,R.id.your_nav_host);

        navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
            @Override
            public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
                Log.e(TAG, "onDestinationChanged: "+destination.getLabel());
            }
        });

สำหรับ Kotlin

var navController :NavController=Navigation.findNavController(this, R.id.nav_host_fragment)
    navController.addOnDestinationChangedListener { controller, destination, arguments ->
        Log.e(TAG, "onDestinationChanged: "+destination.label);

    }

8

อาจจะสายไป แต่สำหรับใครที่ยังมองหา

val currentFragment = NavHostFragment.findNavController(nav_host_fragment).currentDestination?.id

จากนั้นคุณสามารถทำสิ่งที่ชอบ

if(currentFragment == R.id.myFragment){
     //do something
}

โปรดทราบว่านี่มีไว้สำหรับ kotlin รหัส java ควรเกือบจะเหมือนกัน


2
นี่คือรหัส java, stackoverflow.com/a/60539704/4291272
Faisal Shaikh

5
navController().currentDestination?.id

จะให้รหัสปัจจุบันFragmentของคุณอยู่ที่ไหน

private fun navController() = Navigation.findNavController(this, R.id.navHostFragment)

รหัสนี้คือรหัสที่คุณระบุในNavigation Graph XMLไฟล์ของคุณภายใต้fragmentแท็ก คุณยังสามารถเปรียบเทียบได้currentDestination.labelหากต้องการ


4

พบโซลูชันการทำงาน

private fun getCurrentFragment(): Fragment? {
    val currentNavHost = supportFragmentManager.findFragmentById(R.id.nav_host_id)
    val currentFragmentClassName = ((this as NavHost).navController.currentDestination as FragmentNavigator.Destination).className
    return currentNavHost?.childFragmentManager?.fragments?.filterNotNull()?.find {
        it.javaClass.name == currentFragmentClassName
    }
}

3

จากกิจกรรมที่ใช้NavHostFragmentคุณสามารถใช้รหัสด้านล่างเพื่อดึงอินสแตนซ์ของไฟล์Active Fragment.

val fragmentInstance = myNavHostFragment?.childFragmentManager?.primaryNavigationFragment

3

ความต้องการของฉันคือรับส่วนที่มองเห็นได้ในปัจจุบันจากกิจกรรมหลักวิธีแก้ปัญหาของฉันคือ

 private LoginFragment getCurrentVisibleFragment() {
        NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().getPrimaryNavigationFragment();
        FragmentManager fragmentManager = navHostFragment.getChildFragmentManager();
        Fragment loginFragment = fragmentManager.getPrimaryNavigationFragment();
        if(loginFragment instanceof LoginFragment){
            return (LoginFragment)loginFragment;
        }
        return null;
    }

สิ่งนี้อาจช่วยบางคนที่มีปัญหาเดียวกัน


ได้ Kotlin lang?
IgorGanapolsky

1
สิ่งนี้ใช้ได้ผลดีสำหรับฉันไม่แน่ใจว่ามีอะไรเกิดขึ้นกับคำตอบอื่น ๆ หรือไม่? บางทีสิ่งนี้อาจไม่ได้ผลก่อนหน้านี้ แต่มันใช้งานได้เหมือนมีเสน่ห์ในตอนนี้
Wess

2

ตามคำตอบของ @slhddn และแสดงความคิดเห็นนี่คือวิธีที่ฉันใช้งานและดึงรหัสส่วนจากไฟล์nav_graph.xml :

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setSupportActionBar(findViewById(R.id.toolbar))

    val navController = findNavController(this, R.id.nav_host_fragment)

    ivSettingsCog.setOnClickListener {

        if (navController.currentDestination?.id == R.id.updatesFragment) // Id as per set up on nav_graph.xml file
        {
            navController.navigate(R.id.action_updatesFragment_to_settingsFragment)
        }

    }

}

}

1

กรุณาตรวจสอบกับgetChildFragmentManager()โทร

NavHostFragment fragment = supportFragmentManager.findFragmentById(R.id.nav_host);
MyFragment frag = (MyFragment) fragment.getChildFragmentManager().findFragmentByTag(tag);

1

ทำ:

•ในบางปุ่มในส่วนของคุณ:

val navController = findNavController(this)
  navController.popBackStack()

•ในกิจกรรมของคุณ onBackPressed ()

override fun onBackPressed() {
        val navController = findNavController(R.id.nav_host_fragment)
        val id = navController.currentDestination?.getId()
        if (id == R.id.detailMovieFragment){
            navController.popBackStack()
            return
        }

        super.onBackPressed()
    } 

1

หากคุณต้องการอินสแตนซ์ของส่วนของคุณคุณสามารถไปกับ:

(กิจกรรม) => supportFragmentManager.fragments.first().childFragmentManager.fragments.first()

มันน่าเกลียดมากแต่จากตรงนั้นคุณสามารถตรวจสอบได้ว่าเป็นตัวอย่างของชิ้นส่วนที่คุณต้องการเล่นด้วยหรือไม่


1

บน Androidx ฉันได้ลองหลายวิธีในการค้นหาส่วนที่ต้องการจากNavHostFragmentไฟล์. ในที่สุดฉันก็สามารถแตกด้วยวิธีการด้านล่าง

public Fragment getFunctionalFragment (String tag_name)
{
    NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
    FragmentManager navHostManager = Objects.requireNonNull(navHostFragment).getChildFragmentManager();

    Fragment fragment=null;
    List fragment_list = navHostManager.getFragments();

    for (int i=0; i < fragment_list.size() ; i ++ )
    {
        if ( fragment_list.get(i) instanceof HomeFragment && tag_name.equals("frg_home")) {
            fragment = (HomeFragment) fragment_list.get(i);
            break;
        }
    }

    return fragment;
}

1
ยินดีต้อนรับสู่ SO! ก่อนที่คุณจะโพสต์คำตอบโปรดตรวจสอบ ... รหัสไม่ชัดเจน ปัญหาอื่น: หากคุณเป็นเพียงการนำโค้ดมาอธิบายวิธีแก้ปัญหาของคุณเล็กน้อยสูงสุดเมื่อมีคำตอบอีก 16 คำตอบดังนั้นคุณควรอธิบายข้อดีของคำตอบของคุณ
David García Bodego

1

แฟรกเมนต์แรกในส่วน navhost คือแฟรกเมนต์ปัจจุบัน

Fragment navHostFragment = getSupportFragmentManager().getPrimaryNavigationFragment();
if (navHostFragment != null) 
{Fragment fragment = navHostFragment.getChildFragmentManager().getFragments().get(0);}

คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับคำตอบของคุณอีกเล็กน้อยได้ไหม อาจจะโดยการอธิบายรหัสของคุณ
ยี่สิบ

ไม่แนะนำให้ใช้คำตอบแบบใช้รหัสเท่านั้น โปรดให้คำอธิบายว่าทำไมและคำตอบของคุณช่วยแก้ปัญหาได้อย่างไร
Igor F.

1

ขั้นแรกคุณจะได้รับแฟรกเมนต์ปัจจุบันโดยใช้ไอดีจากนั้นคุณจะพบแฟรกเมนต์ขึ้นอยู่กับไอดีนั้น

int id = navController.getCurrentDestination().getId();
Fragment fragment = getSupportFragmentManager().findFragmentById(id);

0

ฉันรวมคำตอบ Andrei ToadersและMukul Bhardwajs ตอบด้วยOnBackStackChangedListener .

เป็นแอตทริบิวต์:

private FooFragment fragment;

ในไฟล์ onCreate

NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host);
FragmentManager navHostManager = Objects.requireNonNull(navHostFragment).getChildFragmentManager();
FragmentManager.OnBackStackChangedListener listener = () -> {
        List<Fragment> frags = navHostManager.getFragments();
        if(!frags.isEmpty()) {
            fragment = (FooFragment) frags.get(0);
        }
};
navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
        if(destination.getId()==R.id.FooFragment){
            navHostManager.addOnBackStackChangedListener(listener);
        } else {
            navHostManager.removeOnBackStackChangedListener(listener);
           fragment = null;
        }
});

ด้วยวิธีนี้ฉันจะได้รับชิ้นส่วนซึ่งจะแสดงในภายหลัง แม้แต่ตัวเดียวก็สามารถวนซ้ำได้fragsและตรวจสอบส่วนต่างๆด้วยinstanceof.


0

ฉันต้องทำสิ่งนี้เพื่อตั้งค่ามุมมองการนำทางด้านล่างและฉันทำด้วยวิธีนี้:

val navController = Navigation.findNavController(requireActivity(), R.id.nav_tabs_home)
        val bottomNavBar: BottomNavigationView = nav_content_view
        NavigationUI.setupWithNavController(bottomNavBar, navController)

0

วิธีที่ดีที่สุดในการดำเนินการนี้คือการลงทะเบียนการเรียกกลับวงจรชีวิตของส่วนย่อยการเรียกกลับวงจรชิ้นส่วน

ตามคำถามเดิมหากคุณNavHostFragmentถูกกำหนดให้เป็น ...

<fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host"
        app:navGraph= "@navigation/nav_item"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost= "true"
        />

จากนั้นในกิจกรรมหลักของคุณonCreate(..)...

nav_host.childFragmentManager.registerFragmentLifecycleCallbacks(
    object:FragmentManager.FragmentLifecycleCallbacks() {
        override fun onFragmentViewCreated(
            fm: FragmentManager, f: Fragment, v: View,
            savedInstanceState: Bundle?
        ) {
            // callback method always called whenever a
            // fragment is added, or, a back-press returns
            // to the start-destination
        }
    }
)

วิธีการโทรกลับอื่น ๆ อาจถูกแทนที่เพื่อให้เหมาะกับความต้องการของคุณ


0

วิธีนี้จะใช้ได้ในสถานการณ์ส่วนใหญ่ลองสิ่งนี้:

val mainFragment = fragmentManager?.primaryNavigationFragment?.parentFragment?.parentFragment as MainFragment

หรือสิ่งนี้:

val mainFragment = fragmentManager?.primaryNavigationFragment?.parentFragment as MainFragment

0

รหัสนี้ทำงานจากฉัน

NavDestination current = NavHostFragment.findNavController(getSupportFragmentManager().getPrimaryNavigationFragment().getFragmentManager().getFragments().get(0)).getCurrentDestination();

switch (current.getId()) {
    case R.id.navigation_saved:
        // WRITE CODE
        break;
}

0

สิ่งนี้ใช้ได้กับฉัน

(navController.currentDestination as FragmentNavigator.Destination).className 

มันจะคืนcanonicalNameส่วนของคุณ


ดูเหมือนว่า Reflection
IgorGanapolsky

0

อาจจะช้าไป แต่อาจช่วยใครบางคนได้ในภายหลัง

หากคุณใช้การนำทางที่ซ้อนกันคุณจะได้รับรหัสเช่นนี้ใน Kotlin

val nav = Navigation.findNavController(requireActivity(), R.id.fragment_nav_host).currentDestination

และนี่คือหนึ่งในแฟรกเมนต์ใน fragment_nav_host.xml

<fragment
    android:id="@+id/sampleFragment"
    android:name="com.app.sample.SampleFragment"
    android:label="SampleFragment"
    tools:layout="@layout/fragment_sample" />

และคุณสามารถตรวจสอบทั้งหมดที่คุณต้องการได้เช่นนี้

if (nav.id == R.id.sampleFragment || nav.label == "SampleFragment"){}

0

ในที่สุดวิธีแก้ปัญหาสำหรับผู้ที่ยังคงค้นหาจริงๆแล้วมันง่ายมากและคุณสามารถทำได้โดยใช้การโทรกลับ

ทำตามขั้นตอนเหล่านี้:

  1. สร้าง Listener ภายในส่วนที่คุณต้องการรับอินสแตนซ์จากกิจกรรม onCreate ()

    public class HomeFragment extends Fragment {
    
    private OnCreateFragment createLIstener;
    
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        createLIstener.onFragmentCreated(this);
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        //findViews(root);
        return root;
    }
    
    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu_main, menu);
    
    }
    
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId()==R.id.action_show_filter){
            //do something
        }
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            createLIstener = (OnCreateFragment) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnArticleSelectedListener");
            }
        }
    
        public interface OnCreateFragment{
            void onFragmentCreated(Fragment f);
        }
    }
    
  2. นำฟังของคุณไปใช้ในส่วนของโฮสต์ / กิจกรรม

    public class MainActivity extends AppCompatActivity implements HomeFragment.OnCreateFragment {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            BottomNavigationView navView = findViewById(R.id.nav_view);
           // Passing each menu ID as a set of Ids because each
           // menu should be considered as top level destinations.
            AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                    R.id.navigation_home,
                    R. ----)
            .build();
            NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
            NavigationUI.setupWithNavController(navView, navController);
        }
    
        @Override
        public void onFragmentCreated(Fragment f) {
            if (f!=null){
                H.debug("fragment created listener: "+f.getId());
                f.setHasOptionsMenu(true);
            }else {
                H.debug("fragment created listener: NULL");
            }
        }
    }
    

และนั่นคือทุกสิ่งที่คุณต้องการในการทำงาน หวังว่าจะมีคนช่วย


0

วิธีที่ดีที่สุดที่ฉันสามารถหา 1 ชิ้นส่วน Kotlin การใช้งานการนำทาง:

ในไฟล์เลย์เอาต์ของคุณให้เพิ่มแท็ก: "android: tag =" main_fragment_tag ""

<fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host"
        app:navGraph= "@navigation/nav_item"
        android:tag="main_fragment_tag"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost= "true"
        />

ในกิจกรรมของคุณ:

val navHostFragment = supportFragmentManager.findFragmentByTag("main_fragment_tag") as NavHostFragment
val mainFragment = navHostFragment.childFragmentManager.fragments[0] as MainFragment
mainFragment.mainFragmentMethod()


-2

ในกิจกรรมของคุณกำหนดอ็อบเจ็กต์แฟรกเมนต์ และจากแต่ละแฟรกเมนต์เรียกเมธอดนี้โดยการส่งอ็อบเจ็กต์แฟรกเมนต์เช่นดังนั้นอ็อบเจ็กต์แฟรกเมนต์คงที่จะถูกแทนที่โดยปัจจุบันที่แสดงแฟรกเมนต์ทุกครั้ง

//method in MainActivity
private static Fragment fragment;

public void setFragment(Fragment fragment){
this.fragment = fragment;
}

//And from your fragment class, you can call
((<yourActivity in which fragment present>)getActivity()).setFragment(<your fragment object>);

//if you want to set it directly;
 ((<yourActivity in which fragment present>)getActivity()).fragment=<your fragment object>;

คุณยังสามารถตั้งค่าการโทรกลับจากส่วนย่อยไปยังกิจกรรมเพื่อแนวทางที่ดีขึ้นและส่งผ่านออบเจ็กต์แฟรกเมนต์ปัจจุบัน


2
ขอขอบคุณสำหรับเวลาของคุณ. ฉันกำลังมองหาสิ่งที่จะใช้จากส่วนประกอบการนำทางเอง
Alin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.