#java #android #android-studio #kotlin
#java #Android #android-studio #kotlin
Вопрос:
итак, это ошибка в logcat, однако, когда я пытаюсь объявить «CreateNoteFragment» в манифесте только .Появляется MainActivity amp; .SplashScreen и не позволяет мне объявлять .CreateNoteFragment
мой CreateNoteFragment также ссылается на действие «BaseFragment» как таковое ниже ошибки. мой код нажатия кнопки находится в .MainActivity — единственном месте, где он не сломается, и вот код для этого ниже. при нажатии происходит сбой приложения, любая помощь будет оценена
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.moradi.moradinotespro/com.moradi.moradinotespro.CreateNoteFragment}; have you declared this activity in your AndroidManifest.xml?
class CreateNoteFragment : BaseFragment() {
//Button Click Create Note
fabBtnCreateNote == findViewById(R.id.fabBtnCreateNote)
fabBtnCreateNote.setOnClickListener {
val intent = Intent(this, CreateNoteFragment::class.java)
startActivity(intent)
}
replaceFragment(HomeFragment.newInstance(), true)
}
включен манифест
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.moradi.moradinotespro">
<!-- Permissions
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
-->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"/>
<activity android:name=".SplashScreenActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Всплеск
class SplashScreenActivity : AppCompatActivity() {
lateinit var handler: Handler
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash_screen)
handler = Handler()
handler.postDelayed({
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}, 2000) // delaying for 2 sec till open
}
}
Действие CreateNoteFragment
class CreateNoteFragment : BaseFragment() {
var currentDate:String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_create_note, container, false)
}
companion object {
@JvmStatic
fun newInstance() =
CreateNoteFragment().apply {
arguments = Bundle().apply {
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val sdf = SimpleDateFormat("dd/m/yyyy hh:m:ss")
currentDate = sdf.format(Date())
tvDateTime.text = currentDate
imgDone.setOnClickListener {
//Save Note
saveNote()
}
imgBack.setOnClickListener {
replaceFragment(HomeFragment.newInstance(), false)
}
}
private fun saveNote() {
if (etNoteTitle.text.isNullOrEmpty()) {
Toast.makeText(context, "Title Required", Toast.LENGTH_SHORT).show()
}
if (etNoteSubTitle.text.isNullOrEmpty()) {
Toast.makeText(context, "SubTitle Required", Toast.LENGTH_SHORT).show()
}
if (etNoteDesc.text.isNullOrEmpty()) {
Toast.makeText(context, "Note Required", Toast.LENGTH_SHORT).show()
}
launch {
val notes = Notes()
notes.title = etNoteTitle.text.toString()
notes.subTitle = etNoteSubTitle.text.toString()
notes.noteText = etNoteDesc.text.toString()
notes.dateTime = currentDate
context?.let {
NotesDatabase.getDatabase(it).noteDao().insertNotes(notes)
etNoteTitle.setText("")
etNoteSubTitle.setText("")
etNoteDesc.setText("")
}
}
}
private fun replaceFragment(fragment: Fragment, istransition: Boolean) {
val fragmentTransition = activity!!.supportFragmentManager.beginTransaction()
if (istransition) {
fragmentTransition.setCustomAnimations(
android.R.anim.slide_out_right,
android.R.anim.slide_in_left
)
}
fragmentTransition.replace(R.id.frame_layout, fragment)
.addToBackStack(fragment.javaClass.simpleName)
}
}
Комментарии:
1. проверьте, определено ли MainActivity в манифесте или нет
2. это не устраняет проблему
3. можете ли вы показать код заставки, если вы собираетесь перейти к mainactivity из splash
4. ну, это сложно, я полагаю, я пытаюсь перейти к действию CreateNoteFragment, но в манифесте это не позволит мне добавить CreateNoteFragment в манифест, только заставку и Main, но из заставки он переходит к домашнему фрагменту, затем, когда я нажимаю кнопку добавить заметку в goto CreateNoteFragment, он выходит из строя. я обновил сообщение дополнительным кодом
5. вы не можете добавить фрагмент в манифест
Ответ №1:
Проблема здесь:
fabBtnCreateNote.setOnClickListener {
val intent = Intent(this, CreateNoteFragment::class.java)
startActivity(intent)
}
CreateNoteFragment не является действием, поэтому вы не можете запустить его как действие
Сначала вам нужно создать main_activity.xml файл и отдельный идентификатор Framelayout с помощью «frame_layout» следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
Затем измените set content view для MainActivity с помощью этой строки:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
}
Вам необходимо заменить из HomeFragment на CreateNoteFragment:
fabBtnCreateNote.setOnClickListener {
val newFragment = CreateNoteFragment.newInstance()
activity?.let {activity->
val transaction = activity.supportFragmentManager.beginTransaction()
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment,CreateNoteFragment::class.simpleName);
// Commit the transaction
transaction.commit();
}
}
Ваш CreateNoteFragment был добавлен в back stack, поэтому вы просто вызываете onBackPress() при нажатии кнопки back:
Измените свой код:
imgBack.setOnClickListener {
activity.onBackPress()
}
Комментарии:
1. однако, когда я изменяю код, он говорит неразрешенную ссылку: newFragment newFragment = new CreateNoteFragment(); и неразрешенная ссылка: фрагменттранзакции
2. Я только что обновил свой ответ версией Kotlin, надеюсь, это поможет решить вашу проблему
3. Спасибо, к сожалению, он все еще сбой с обновленным кодом, это очень странно
4. но я думаю, что это связано с чем-то другим, потому что logcat теперь показывает этот java.lang. Исключение ClassCastException: com.google.android.material.floatingactionbutton. FloatingActionButton не может быть передан в android.view.ViewGroup тьфу
5. покажите свой новый код и main_activity.xml код, пожалуйста!