如何在框架布局中插入片段布局

时间:2019-05-19 20:16:09

标签: android kotlin

我试图首次使用Kotlin创建一个Android应用程序,并试图在用户单击导航图标而不使它们与我的底部导航栏重叠时使用不同的片段布局。我已经创建了一个FrameLayout,旨在将片段布局放入其中,但是不清楚如何编写代码来实现。

这是我现在覆盖Nav栏的MainActivity.kt:

private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
       when (item.itemId) {
            R.id.navigation_home -> {
                setContentView(R.layout.fragment_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_favorites -> {
                setContentView(R.layout.fragment_favorite)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_calculator -> {
                setContentView(R.layout.fragment_calculator)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

这是我的框架布局:

<FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above= "@id/nav_view">

</FrameLayout>

2 个答案:

答案 0 :(得分:0)

在选择NavBar上的选项卡时,您想导航到适当的片段。这就是你的方法。

假设我们有一个MainActivity,其中包含3个标签:“ Tab1”,“ Tab2”,“ Tab3” MainActivity将具有2个XML布局:navBar和FrameLayout。 然后,您将要创建3个新的片段(每个片段也具有自己的XML布局)。选择适当的导航栏选项卡后,这3个片段将显示帧布局的视图

例如:

主要活动XML

<FrameLayout
    android:id="@+id/mainFragment"
    android:layout_width="match_parent"
    android:background="#ffffff"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottom_nav"
    android:text="@string/title_home" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_nav"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="?android:attr/windowBackground"
    app:menu="@menu/bottom_navigation" />

主要活动克里特林

class MainActivity : AppCompatActivity() {

private lateinit var manager: FragmentManager
private lateinit var transaction: FragmentTransaction

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_tab1 -> {

            title = "Tab1"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab1Fragment())
            transaction.addToBackStack(null)
            transaction.commit()


            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab2 -> {

            title = "Tab2"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab2Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab3 -> {

            title = "Tab 3"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab3Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

@SuppressLint("CommitTransaction")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val navigation = findViewById<View>(R.id.bottom_nav) as BottomNavigationView
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    }
}

答案 1 :(得分:0)

请参考非常好的知识来源:https://developer.android.com/training/basics/fragments/fragment-ui#AddAtRuntime

基本上,您需要创建链接中提到的交易:

models.py

class Vendor(models.Model):
    user = models.OneToOneField(User, related_name='vendor', on_delete=models.CASCADE)
    name = models.CharField(max_length=128, blank=True, null=True)
    phone = models.CharField(max_length=32, blank=True, null=True)
    open = models.IntegerField(default=0, blank=True, null=True)
    close = models.IntegerField(default=0, blank=True, null=True)
    address = models.CharField(max_length=256, blank=True, null=True)
    lat = models.CharField(max_length=32, blank=True, null=True)
    lon = models.CharField(max_length=32, blank=True, null=True)

views.py
def get_by_ten_km(request):
    user_lat = request.data.get('lat')
    user_lon = request.data.get('lon')
    radius = 10
    point = Point(user_lat, user_lon)
    vendors = Vendor.objects.filter(address=)

所以在您的情况下:

gmaps = googlemaps.Client(key='api_key')


def get_cords_by_address(address):
    return gmaps.geocode(address)

您还可以使用val transaction = supportFragmentManager.beginTransaction().apply { // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back replace(R.id.fragment_container, newFragment) addToBackStack(null) transaction.commit() } 代替when (item.itemId) { var fragment: Fragment R.id.navigation_home -> { fragment = HomeFragment() } . . . val transaction = supportFragmentManager.beginTransaction().apply { replace(R.id.fragment_container, fragment) addToBackStack(null) transaction.commit()

请参考这篇文章,以确定使用哪种方法: Difference between add(), replace(), and addToBackStack()