• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

java.lang.NullPointerException: inflate(inflater, R.layo…t_home, container, false) must not be null 같은 오류가 발생합니다.

22.08.12 11:54 작성 조회수 429

0

homefragment부분에서 알 수 없는 오류가 발생하고 있는것 같습니다.

 

먼저 homegrament의 코드입니다.

 

package fragment



import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.navigation.findNavController
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.AllAboutKorea.allaboutkorea.*
import com.AllAboutKorea.allaboutkorea.contentslist.BookmarkRVAdapter
import com.AllAboutKorea.allaboutkorea.contentslist.HistoryActivity
import com.AllAboutKorea.allaboutkorea.contentslist.contentmodel
import com.AllAboutKorea.allaboutkorea.databinding.FragmentHomeBinding
import com.AllAboutKorea.allaboutkorea.utils.FBAuth
import com.AllAboutKorea.allaboutkorea.utils.FBRef
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener


class HomeFragment : Fragment() {


private lateinit var binding : FragmentHomeBinding
//북마크 리스트의 중복 업로드를 막는 코드이다.
var twiceupoad = false
private val TAG = HomeFragment::class.java.simpleName

val bookmarkIdList = mutableListOf<String>()
val items = ArrayList<contentmodel>()
val itemKeyList = ArrayList<String>()

lateinit var rvAdapter : BookmarkRVAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)



}

override fun onCreateView(
inflater: LayoutInflater
, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {

Log.d(
"HomeFragment", "onCreateView")
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)

getbookmarkdata()


//상단 아이콘을 클릭을 하면, 그 아이콘으로 이동하는 코드를 작성하자.

binding.fragmentHomeHistory.setOnClickListener {
val intent = Intent(context,HistoryActivity::class.java)
startActivity(intent)

}
binding.fragmentHomeFood.setOnClickListener {
val intent = Intent(context, FoodActivity::class.java)
startActivity(intent)

}

binding.fragmentHomeKpop.setOnClickListener {
val intent = Intent(context, KpopActivity::class.java)
startActivity(intent)

}

binding.fragmentHomeKdrama.setOnClickListener {
val intent = Intent(context, KdramaActivity::class.java)
startActivity(intent)

}

binding.fragmentHomeKorean.setOnClickListener {
val intent = Intent(context, KoreanActivity::class.java)
startActivity(intent)

}

binding.fragmentHomeTravel.setOnClickListener {
val intent = Intent(context, TravelActivity2::class.java)
startActivity(intent)

}

binding.fragmentHomeFunfacts.setOnClickListener {
val intent = Intent(context, FunfactsActivity::class.java)
startActivity(intent)

}

binding.fragmentHomeEconomy.setOnClickListener {
val intent = Intent(context, EconomyActivity::class.java)
startActivity(intent)

}

binding.fragmentHomeKbeauty.setOnClickListener {
val intent = Intent(context, KbeautyActivity::class.java)
startActivity(intent)

}


//하단 아이콘을 클릭을 하면, 그 아이콘으로 이동하는 코드를 작성하자.



binding.tipTap.setOnClickListener {
Log.d("HomeFragment", "tipTap")
it.findNavController().navigate(R.id.action_homeFragment_to_tipFragment)
}



binding.bookmarkTap.setOnClickListener {
it.findNavController().navigate(R.id.action_homeFragment_to_bookmarkFragment)
}

binding.storeTap.setOnClickListener {
it.findNavController().navigate(R.id.action_homeFragment_to_storeFragment)
}

rvAdapter = BookmarkRVAdapter(requireContext(), items, itemKeyList, bookmarkIdList)

val rv : RecyclerView = binding.mainRV
rv.adapter = rvAdapter

rv.layoutManager = GridLayoutManager(requireContext(), 2)

getCategoryData()

return binding.root
}

private fun getCategoryData(){

val postListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {

for (dataModel in dataSnapshot.children) {

val item = dataModel.getValue(contentmodel::class.java)

items.add(item!!)
itemKeyList.add(dataModel.key.toString())


}

rvAdapter.notifyDataSetChanged()

}


override fun onCancelled(databaseError: DatabaseError) {
// Getting Post failed, log a message
Log.w("ContentListActivity", "loadPost:onCancelled", databaseError.toException())
}
}
FBRef.
category_history.addValueEventListener(postListener)
FBRef.
category_food.addValueEventListener(postListener)
FBRef.
category_k_pop.addValueEventListener(postListener)
FBRef.
category_k_drama.addValueEventListener(postListener)
FBRef.
category_korean.addValueEventListener(postListener)
FBRef.
category_travel.addValueEventListener(postListener)
FBRef.
category_funfacts.addValueEventListener(postListener)
FBRef.
category_economy.addValueEventListener(postListener)
FBRef.
category_k_beauty.addValueEventListener(postListener)
}
private fun getbookmarkdata(){


val postListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {

//북마크를 동적으로 삭제하기 위한 코드.



bookmarkIdList.clear()

//데이터를 더하는 불러오는 역활.
for(dataModel in dataSnapshot.children){

Log.e(
TAG,dataModel.toString())
bookmarkIdList.add(dataModel.key.toString())
}

//1.전체 카테고리에 있는 컨텐츠 데이터들을 다 가져온다.
//자세한 코드는 여기 안에 있다.
if(twiceupoad==false) {
twiceupoad=true
getCategoryData()
}
//이렇게 코드를 실행하면, getCategoryData getbookmarkdata
//의 정보를 잘 알기 때문에, 북마크가 아닌 것을 잘 거를 수 있다.


}

override fun onCancelled(databaseError: DatabaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
}
}

//북마크 데이터를 불러오는 코드이다.
FBRef.bookmarkref.child(FBAuth.getUid()).addValueEventListener(postListener)

}


}



그 다음은 xml 파일입니다.

<?xml version="1.0" encoding="utf-8"?>
<layout 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">



<!-- TODO: Update blank fragment layout -->

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">


<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="53dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp">


<ImageView
android:id="@+id/fragment_home_history"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_history" />

<ImageView
android:id="@+id/fragment_home_food"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_food" />

<ImageView
android:id="@+id/fragment_home_kpop"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_kpop" />



</LinearLayout>







<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp">

<ImageView
android:id="@+id/fragment_home_kdrama"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_kdrama" />

<ImageView
android:id="@+id/fragment_home_korean"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_korean" />

<ImageView
android:id="@+id/fragment_home_travel"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_travel" />



</LinearLayout>




<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp">

<ImageView
android:id="@+id/fragment_home_funfacts"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_funfacts" />

<ImageView
android:id="@+id/fragment_home_economy"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_economy" />

<ImageView
android:id="@+id/fragment_home_kbeauty"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_weight="1"
android:src="@drawable/icon_kbeauty" />



</LinearLayout>







<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Site list"
android:textSize="20dp"
android:font="@font/happygoheung"


/>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/mainRV"
android:layout_width="match_parent"
android:layout_height="600dp" />


</LinearLayout>

</ScrollView>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="3dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout">

<LinearLayout
android:background="@color/mainColor"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>



</LinearLayout>

<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/white"
android:weightSum="4"
app:layout_constraintBottom_toBottomOf="parent">

<ImageView
android:id="@+id/homeTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/hometaps" />

<ImageView
android:id="@+id/tipTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/tiptaps" />



<ImageView
android:id="@+id/bookmarkTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/bookmarks" />

<ImageView
android:id="@+id/storeTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/koreanet" />

</LinearLayout>



</androidx.constraintlayout.widget.ConstraintLayout>



</layout>


오류는 이렇습니다.

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.allaboutkorea.allaboutkorea, PID: 11378 java.lang.NullPointerException: inflate(inflater, R.layo…t_home, container, false) must not be null at fragment.HomeFragment.onCreateView(HomeFragment.kt:55) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128) at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065) at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128) at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072) at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251) at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502) at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435) at android.app.Activity.performStart(Activity.java:8024) at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3475) at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

이런 오류가 뜨고, 앱을 켜고 들어가려는 순간 앱이 꺼집니다.

도움을 주신다면 대단히 감사드리겠습니다.


감사합니다!

답변 1

답변을 작성해보세요.

0

일단은 저 레이아웃이랑 연결이 잘못된거 같은데

저 레이아웃 파일 이름이

fragment_home

이 맞나요?

 

그리고 처음부터 에러가 떳나요 코드를 어디까지 작성했을 때 에러가 떳나요?

 

조금 더 자세히 과정을 알려주시겠어요?

이장한님의 프로필

이장한

질문자

2022.08.16

파일 이름이 맞습니다.

그리고 처음에는 에러가 전혀 안떴었는데

app bundle 에 맞는 이름으로 바꾸는 과정에서 오류가 났습니다.

app bundle에 맞는 이름으로 바꿧다는게 어떤 뜻일까요?

세팅에 문제라면

HomeFragment2를 만들어서 다시 시도해보시겠어요?

이장한님의 프로필

이장한

질문자

2022.08.17

앱을 출시할 때, app bundle 파일을 만들 때 파일의 이름이 규격에 맞지 않아서 이름을 바꿨었습니다.

그래서 패키지의 이름을 통째로 바꾸었는데, 그 때문에 오류가 발생한 거일 수도 있을 것 같습니다.

네 패키지명을 바꾸면 문제가 생기는 경우가 종종 있습니다.

새롭게 파일을 만들어서 다시 진행해보시겠어요?

이장한님의 프로필

이장한

질문자

2022.08.20

네 알겠습니다!