2015-06-27 61 views
2

我正在嘗試用Kotlin開發Android應用程序,但在嘗試動態移動片段時遇到了一些問題。我想要做的是用一個片段替換活動佈局中的FrameLayout。目前,無論何時我嘗試運行我的應用程序,它都會在工具欄下方顯示一個白色屏幕,導致我相信該片段未按照我的預期方式添加到FrameLayout中。如何用Android上的Kotlin代碼片段替換FrameLayout

這是我的主要活動,我做的第一筆交易:

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() 
    } 
} 

這裏是我試圖創建的片段。它只是膨脹期,同時增加在按下按鈕的回調:

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 
    } 
} 

下面是主要的活動與的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> 

而且最後這裏是該片段是佈局充氣:

<?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> 

我覺得這是具有可與其它片段被換出一個的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> 
+1

不知道這是唯一的問題有,但'LinearLayout'在活動視圖應該有'方向=「垂直」 – rciovati

+0

哇,我不能相信它;修復它。我猜想當我從非片段佈局切換到片段佈局時,方向會丟失。 XY問題的經典案例。非常感謝。如果您將此作爲答案提交,我可以接受。 – mrobinson7627

+0

在異步操作結束時,您不應執行FragmentTransaction:如果事務嘗試在onStop()之後執行,您將得到IllegalStateException。 – BladeCoder

回答

2

的問題是,該活動的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>