Как передать правильный контекст во фрагменте с представлением переработчика? - PullRequest
0 голосов
/ 10 апреля 2019

Я делаю приложение для Android в Котлине, которое должно представлять мое резюме.Я сделал это с учетом фрагментов и переработчика.Первая вкладка в tabLayout должна содержать мою биографию, вторая должна иметь образование и третий опыт работы.Также вторая и третья вкладка должны быть выполнены с видом переработчика.Проблема состоит в том, что одно из представлений рециркулятора возвращает ноль, где находится контекст.Образование и опыт работы работают одинаково.

Я пробовал разные типы контекста и не нашел такой работы.Также попытался переместить layoutManager и DefaultItemAnimator в MainActivity, но это не помогло (я использовал «this» в качестве контекста, когда переместил его в MainActivity).

Github link: https://github.com/CookieTheMonsta/MyCV
class Education: Fragment() {

    companion object {
        fun newInstance(): Education {
            return Education()
        }
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.education,container,false)
        educationDisplay.layoutManager = LinearLayoutManager(container?.context,RecyclerView.VERTICAL,false)
        educationDisplay.itemAnimator = DefaultItemAnimator()
        educationDisplay.addItemDecoration(DividerItemDecoration(container?.context, RecyclerView.VERTICAL))
        return view
    }
}
class MainActivity : AppCompatActivity() {

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

        setUpUi()
    }

    private fun setUpUi() {
        viewPager.adapter = FragmentAdapter(supportFragmentManager)
        tabLayout.setupWithViewPager(viewPager)


        displayData()

    }

    fun displayData() {

        /*educationDisplay.adapter = EducationAdapter(EducationRepository.educations)
        workexpDisplay.adapter = WorkExperienceAdapter(WorkRepository.works)*/
    }
}

Список ошибок из Logcat

2019-04-10 15:57:44.260 9004-9004/hr.ferit.sumigaborna.mycv E/AndroidRuntime: FATAL EXCEPTION: main
    Process: hr.ferit.sumigaborna.mycv, PID: 9004
    java.lang.RuntimeException: Unable to start activity ComponentInfo{hr.ferit.sumigaborna.mycv/hr.ferit.sumigaborna.mycv.MainActivity}: java.lang.IllegalStateException: educationDisplay must not be null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.IllegalStateException: educationDisplay must not be null
        at hr.ferit.sumigaborna.mycv.MainActivity.displayData(MainActivity.kt:39)
        at hr.ferit.sumigaborna.mycv.MainActivity.setUpUi(MainActivity.kt:33)
        at hr.ferit.sumigaborna.mycv.MainActivity.onCreate(MainActivity.kt:25)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

Приложение должно иметь 3 вкладки, во-первых, это биография, которую вы можете игнорировать, поскольку она не доставляет проблем.На вкладках «Образование» и «Опыт работы» должны отображаться сведения о переработчике с моей информацией.Но они не потому, что

1 Ответ

1 голос
/ 10 апреля 2019

Вы обрабатываете свой пользовательский интерфейс фрагментов в Деятельности, чего не следует делать, и поэтому вы получаете NPE.

Давайте пойдем шаг за шагом.Определите Activity и установите ViewPager вместе с поведением его вкладки, и это единственная логика пользовательского интерфейса, которую ваш класс Activity будет иметь

class MainActivity : AppCompatActivity() {

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

        setUpUi()
    }

    private fun setUpUi() {
        viewPager.adapter = FragmentAdapter(supportFragmentManager)
        tabLayout.setupWithViewPager(viewPager)

        // set tabLayout's behaviour with the corresponding fragments
    }
}

Теперь, когда ваш ViewPager установлен, и вы добавили Fragment, обрабатывайте свои фрагментыПредставление, например:

class Education: Fragment() {

    companion object {
        fun newInstance(): Education {
            return Education()
        }
    }
    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        displayEducationData()
    }

    private fun displayEducationData() {
        educationDisplay.layoutManager = LinearLayoutManager(activity,RecyclerView.VERTICAL,false)
        educationDisplay.itemAnimator = DefaultItemAnimator()
   educationDisplay.addItemDecoration(DividerItemDecoration(activity, RecyclerView.VERTICAL))
        educationDisplay.adapter = EducationAdapter(EducationRepository.educations)
    } 
}

Теперь сделайте то же самое для фрагмента WorkExperience.

PS: я предполагаю, что вы используете расширение представления Kotlin, если не забыли получить ссылкуto educationDisplay с findViewById внутри displayEducationData() перед вызовом чего-либо на нем

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