gpt4 book ai didi

android - 如何在 Android 上使用 Kotlin 将 FrameLayout 替换为 fragment

转载 作者:太空宇宙 更新时间:2023-11-03 10:18:21 27 4
gpt4 key购买 nike

我正在尝试使用 Kotlin 开发 Android 应用程序,但在尝试动态移动 fragment 时遇到了一些障碍。我想要做的是用 fragment 替换 Activity 布局中的 FrameLayout。目前,每当我尝试运行我的应用程序时,它只会在工具栏下方显示一个白屏,让我相信 fragment 没有按照我预期的方式添加到 FrameLayout。

这是我进行第一笔交易的主要 Activity :

package net.ma.ttrobinson.kchan

import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.EditText
import com.androidquery.callback.AjaxStatus
import net.ma.ttrobinson.kchan.api.ChanThread
import net.ma.ttrobinson.kchan.api.Request
import org.jdeferred.DoneCallback
import org.jdeferred.FailCallback
import org.json.JSONArray
import org.json.JSONObject

class MainActivity : AppCompatActivity() {

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

val toolbar = findViewById(R.id.toolbar) as Toolbar
setSupportActionBar(toolbar)

getSupportFragmentManager().beginTransaction()
.replace(R.id.main_content_frame, MainFragment())
.commit()
}
}

这是我尝试创建的 fragment 。它只是在为按下按钮时添加回调的同时膨胀 View :

package net.ma.ttrobinson.kchan

import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import com.androidquery.callback.AjaxStatus
import net.ma.ttrobinson.kchan.api.ChanThread
import net.ma.ttrobinson.kchan.api.Request
import org.jdeferred.DoneCallback
import org.jdeferred.FailCallback

/**
* Holds the main content
*/
class MainFragment : Fragment() {
companion object {
val TAG = "MainFragment"
}

val debugBoard = "g"
val debugThread = "48667796"

override fun onCreateView(inflater : LayoutInflater, parent : ViewGroup?, savedInstanceState : Bundle?) : View {
val v = inflater.inflate(R.layout.fragment_main, parent, false)
val boardText = v.findViewById(R.id.board_text) as EditText
val threadText = v.findViewById(R.id.thread_text) as EditText
val request = Request(getActivity())

boardText.setText(debugBoard)
threadText.setText(debugThread)

val button = v.findViewById(R.id.submit) as Button
button.setOnClickListener({ v ->
val board = boardText.getText().toString()
val thread = threadText.getText().toString().toInt()

val promise = request.getThread(board, thread)
promise.done({ thread ->
val fm = getActivity().getSupportFragmentManager()
fm.beginTransaction()
.replace(R.id.main_content_frame, ThreadFragment(thread), ThreadFragment.TAG)
.addToBackStack(null)
.commit()
}).fail({ result ->
Log.v(TAG, "Failed to get thread")
})
})

return v
}
}

这是主 Activity 使用 setContentView 的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />

<FrameLayout
android:id="@+id/main_content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

最后是 fragment 展开的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<EditText
android:id="@+id/board_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/board_hint"/>

<EditText
android:id="@+id/thread_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="phone"
android:hint="@string/thread_hint"/>

<Button
android:id="@+id/submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/submit"/>
</LinearLayout>

我觉得这是一个相当简单的主 Activity 设置,它有一个可以与其他 fragment 交换的 FrameLayout。有谁知道我可能做错了什么?

与此同时,我想我会尝试做一个更简单的案例来尝试复制该行为。

编辑:如此简单的解决方案。我忘了在我的 LinearLayout 中添加 android:orientation="vertical"。这是更新后的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />

<FrameLayout
android:id="@+id/main_content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

最佳答案

问题是 Activity 的 LinearLayout 应该有 orientation="vertical":

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />

<FrameLayout
android:id="@+id/main_content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>

关于android - 如何在 Android 上使用 Kotlin 将 FrameLayout 替换为 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com