При нажатии кнопки я хочу, чтобы макет фрагмента 1 был заменен макетом фрагмента 2, но его бросок: java .lang.NullPointerException - PullRequest
1 голос
/ 09 марта 2020

Код первого фрагмента

class MainFragment : Fragment() {

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val mainInflater = inflater.inflate(R.layout.fragment_main, container, false)
    return mainInflater
}

fun thisdata():String{

    return "Hello from MainFragment"
}

}

Первый фрагмент XML

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

    <EditText
        android:id="@+id/etSavedData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:hint="Enter the Text"/>

    <Button
        android:id="@+id/btnSaveData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="120dp"
        android:text="Save"/>

</RelativeLayout>

Код основного вида деятельности

class MainActivity : AppCompatActivity() {

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

    //Set replace Main Activity content with the Fragment1 content
    val mainFragment = MainFragment()

    supportFragmentManager.beginTransaction().add(R.id.contain_fragment, mainFragment).commit()
    val thedata = mainFragment.thisdata()
    Log.e("Main Frag to Activity", thedata)

    btnSaveData.setOnClickListener { 

        val secondFragment = SecondFragment()
        supportFragmentManager.beginTransaction().add(R.id.contain_fragment, secondFragment).commit()
    }

}

}

Основная деятельность XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    android:id="@+id/contain_fragment"
    tools:context=".MainActivity">


</RelativeLayout>

Код второго фрагмента

class SecondFragment : Fragment() {

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val secondInflater = inflater.inflate(R.layout.fragment_second, container, false)
    return secondInflater
}

}

Второй фрагмент XML

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_dark"
    tools:context=".SecondFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/tvDisplayText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:text="Text displayed here." />

</FrameLayout>

Следующее исключение отображается в Logcat

Причина: java .lang.NullPointerException: попытка вызвать виртуальный метод 'void android .widget.Button.setOnClickListener (android .view.View $ OnClickListener)' для пустой ссылки на объект в com.example.demo2.MainActivity.onCreate (MainActivity.kt: 22) *

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

** Спасибо Ta sh, это действительно имеет смысл, к сожалению, оно все еще показывало то же исключение, но мне наконец удалось решить проблему, выполнив следующее. **

    class MainFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val mainInflater = inflater.inflate(R.layout.fragment_main, container, false)
         mainInflater.btnSaveData.setOnClickListener {

        val secondFragment = SecondFragment()

            secondFragment?.let {
                 activity?.supportFragmentManager?.beginTransaction()?.replace(R.id.contain_fragment, secondFragment)?.commit()
             }

            }
        return mainInflater
    }

    fun thisdata():String{

        return "Hello from MainFragment"
    }

}
0 голосов
/ 09 марта 2020

Вам нужно либо переместить кнопку btnSaveData в MainActivity, либо вы должны переместить onClickListener в MainFragment вместе с некоторыми другими изменениями. Что-то вроде:

class MainFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
          // Inflate the layout for this fragment
         val mainInflater = inflater.inflate(R.layout.fragment_main, container, false)
    btnSaveData.setOnClickListener { 

         val secondFragment = SecondFragment()
         activity.supportFragmentManager.beginTransaction().add(R.id.contain_fragment, secondFragment).commit()
        }
        return mainInflater
    }

    fun thisdata():String{

        return "Hello from MainFragment"
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...