Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63

Создание родительского класса для трёх почти одинаковых фрагментов

12.10.2022, 18:06. Показов 627. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имеется приложении по конвертации валют, длины и объёма. Под каждую задачу написаны фрагменты, которые являются почти идентичными. Их код почти одинаковый, и требуется как-то упростить это дело. Например, создать родительский класс, от которого они могли бы наследоваться. Но каким образом можно это сделать, если в каждом из этих классов разный binding, из которого, однако, достаются одни и те же элементы. Вот код трёх этих классов.

binging, соответственно разный, поскольку используются три разных layout, в которых различаются элементы внутрри спиннера. скриншот интерфейса,на всякий случай, прикрепляю:


MoneyFragment.kt:

Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
class MoneyFragment : Fragment() {
    lateinit var binding: FragmentMoneyBinding
    private val viewModel: AllFragmentsViewModel by activityViewModels<AllFragmentsViewModel>()
    var Type: String = "Money"
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        services.blockKeyboardInput(binding.editText1)
        services.blockKeyboardInput(binding.editText2)
 
        binding.editText2.setOnClickListener {
            binding.editText2.setCursorVisible(false);
//            editText2.isLongClickable = false
        }
 
        binding.editText2.customSelectionActionModeCallback = object : ActionMode.Callback {
            override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false
            }
 
            override fun onDestroyActionMode(mode: ActionMode) {}
            override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false
            }
 
            override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
                return false
            }
        }
 
        binding.btnSwap.setOnClickListener {
            val position_from = binding.spinnerFrom.selectedItemPosition
            val position_to = binding.spinnerTo.selectedItemPosition
 
            binding.spinnerFrom.setSelection(position_to)
            binding.spinnerTo.setSelection(position_from)
 
        }
 
        binding.bntCopy1.setOnClickListener {
 
            copyText(it, binding.editText1)
 
            Toast.makeText(
                [email]this@MoneyFragment.contex[/email]t,
                "Text copied ",
                Toast.LENGTH_LONG
            ).show()
        }
 
        binding.bntCopy2.setOnClickListener {
            copyText(it, binding.editText2)
 
            Toast.makeText(
                [email]this@MoneyFragment.contex[/email]t,
                "Text copied ",
                Toast.LENGTH_LONG
            ).show()
 
        }
 
 
        binding.spinnerFrom.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                adapterView: AdapterView<*>?, view: View?,
                position: Int, id: Long
            ) {
                callConverter()
            }
 
            override fun onNothingSelected(p0: AdapterView<*>?) {
                // NO WAY
            }
 
        }
 
        binding.spinnerTo.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                adapterView: AdapterView<*>?, view: View?,
                position: Int, id: Long
            ) {
                callConverter()
            }
 
            override fun onNothingSelected(p0: AdapterView<*>?) {
                // NO WAY
            }
 
        }
 
 
        viewModel.editTextMessage.value = binding.editText1
 
        viewModel.StringMessageMoney.observe(viewLifecycleOwner) {
 
            if (it.equals("-1")) {
                binding.editText1?.setText("")
            } else if (it.equals("-0")) {
                val cursorPose: Int = binding.editText1.selectionStart
                val textLen: Int = binding.editText1.text.length
 
                if (cursorPose != 0 && textLen != 0) {
                    val selection: SpannableStringBuilder =
                        binding.editText1.text as SpannableStringBuilder
                    selection.replace(cursorPose - 1, cursorPose, "")
                    binding.editText1.setText(selection)
                    binding.editText1.setSelection(cursorPose - 1)
                }
            } else {
                updateString(it)
            }
 
            callConverter()
        }
    }
 
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        binding = FragmentMoneyBinding.inflate(inflater)
        return binding.root
    }
 
    override fun onStart() {
        super.onStart()
        callConverter()
 
    }
 
 
    override fun onDestroy() {
        super.onDestroy()
        viewModel.StringMessageMoney.value =
            "" // очищаю, шоб после переворота не добавился лишний символ
    }
 
 
    fun updateString(strToAdd: String) {
        if (strToAdd.isEmpty())
            return
 
        var oldStr: String = binding.editText1?.text.toString()
        val cursorPos: Int = binding.editText1?.selectionStart
        var leftString: String = oldStr.substring(0, cursorPos)
        var rightStr: String = oldStr.substring(cursorPos)
 
        if (binding.editText1.text.toString().equals("")) {
            binding.editText1.setText(strToAdd)
        } else {
            binding.editText1.setText(String.format("%s%s%s", leftString, strToAdd, rightStr))
        }
 
        if (binding.editText1?.text.length < 13){
            binding.editText1.setSelection(cursorPos + 1)
 
        }
    }
 
    fun callConverter() {
        val type: String = Type
        val from: String = binding.spinnerFrom.selectedItem.toString()
 
        val to: String = binding.spinnerTo.selectedItem.toString()
        val number: String = binding.editText1.text.toString()
        var answer = convert(type, from, to, number)
 
        var response = answer
        if (answer != "")
            response = period(answer)
 
        binding.editText2.setText(response)
//        binding.editText2.setText()
    }
}
FragmentLength.kt:

Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
class LengthFragment : Fragment() {
    lateinit var binding: FragmentLengthBinding
    private val viewModel: AllFragmentsViewModel by activityViewModels<AllFragmentsViewModel>()
    var Type: String = "Length"
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        services.blockKeyboardInput(binding.editText1)
        services.blockKeyboardInput(binding.editText2)
 
        binding.editText2.setOnClickListener {
            binding.editText2.setCursorVisible(false);
        }
 
        binding.editText2.customSelectionActionModeCallback = object : ActionMode.Callback {
            override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false
            }
 
            override fun onDestroyActionMode(mode: ActionMode) {}
            override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false
            }
 
            override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
                return false
            }
        }
 
        binding.btnSwap.setOnClickListener {
            val position_from = binding.spinnerFrom.selectedItemPosition
            val position_to = binding.spinnerTo.selectedItemPosition
 
            binding.spinnerFrom.setSelection(position_to)
            binding.spinnerTo.setSelection(position_from)
 
        }
 
        binding.bntCopy1.setOnClickListener {
 
            copyText(it, binding.editText1)
 
            Toast.makeText(
                [email]this@LengthFragment.contex[/email]t,
                "Text copied ",
                Toast.LENGTH_LONG
            ).show()
        }
 
        binding.bntCopy2.setOnClickListener {
            copyText(it, binding.editText2)
 
            Toast.makeText(
                [email]this@LengthFragment.contex[/email]t,
                "Text copied ",
                Toast.LENGTH_LONG
            ).show()
 
        }
 
 
        binding.spinnerFrom.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                adapterView: AdapterView<*>?, view: View?,
                position: Int, id: Long
            ) {
                callConverter()
            }
 
            override fun onNothingSelected(p0: AdapterView<*>?) {
                // NO WAY
            }
 
        }
 
        binding.spinnerTo.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                adapterView: AdapterView<*>?, view: View?,
                position: Int, id: Long
            ) {
                callConverter()
            }
 
            override fun onNothingSelected(p0: AdapterView<*>?) {
                // NO WAY
            }
 
        }
 
 
        viewModel.editTextMessage.value = binding.editText1
 
        viewModel.StringMessageLength.observe(viewLifecycleOwner) {
 
            if (it.equals("-1")) {
                binding.editText1?.setText("")
            } else if (it.equals("-0")) {
                val cursorPose: Int = binding.editText1.selectionStart
                val textLen: Int = binding.editText1.text.length
 
                if (cursorPose != 0 && textLen != 0) {
                    val selection: SpannableStringBuilder =
                        binding.editText1.text as SpannableStringBuilder
                    selection.replace(cursorPose - 1, cursorPose, "")
                    binding.editText1.setText(selection)
                    binding.editText1.setSelection(cursorPose - 1)
                }
            } else {
                updateString(it)
            }
 
            callConverter()
        }
 
    }
 
 
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentLengthBinding.inflate(inflater)
 
        return binding.root
    }
 
    override fun onStart() {
        super.onStart()
        callConverter()
    }
 
    override fun onDestroy() {
        super.onDestroy()
        viewModel.StringMessageLength.value =
            "" // очищаю, шоб после переворота не добавился лишний символ
    }
 
    fun updateString(strToAdd: String) {
        if (strToAdd.isEmpty())
            return
 
        var oldStr: String = binding.editText1?.text.toString()
        val cursorPos: Int = binding.editText1?.selectionStart
        var leftString: String = oldStr.substring(0, cursorPos)
        var rightStr: String = oldStr.substring(cursorPos)
 
        if (binding.editText1.text.toString().equals("")) {
            binding.editText1.setText(strToAdd)
        } else {
            binding.editText1.setText(String.format("%s%s%s", leftString, strToAdd, rightStr))
        }
 
        if (binding.editText1?.text.length <= 13){
            binding.editText1.setSelection(cursorPos + 1)
 
        }
    }
 
    fun callConverter() {
        val type: String = Type
        val from: String = binding.spinnerFrom.selectedItem.toString()
 
        val to: String = binding.spinnerTo.selectedItem.toString()
        val number: String = binding.editText1.text.toString()
        var answer = convert(type, from, to, number)
 
        var response = answer
        if (answer != "")
            response = services.period(answer)
 
 
        binding.editText2.setText(response)
    }
}

FragmentVolume.kt:

Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
class VolumeFragment : Fragment() {
    lateinit var binding: FragmentVolumeBinding
    private val viewModel: AllFragmentsViewModel by activityViewModels<AllFragmentsViewModel>()
    var Type: String = "Volume"
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        services.blockKeyboardInput(binding.editText1)
        services.blockKeyboardInput(binding.editText2)
 
        binding.editText2.setOnClickListener {
            binding.editText2.setCursorVisible(false);
        }
 
        binding.editText2.customSelectionActionModeCallback = object : ActionMode.Callback {
            override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false
            }
 
            override fun onDestroyActionMode(mode: ActionMode) {}
            override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false
            }
 
            override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
                return false
            }
        }
 
        binding.btnSwap.setOnClickListener {
            val position_from = binding.spinnerFrom.selectedItemPosition
            val position_to = binding.spinnerTo.selectedItemPosition
 
            binding.spinnerFrom.setSelection(position_to)
            binding.spinnerTo.setSelection(position_from)
 
        }
 
        binding.bntCopy1.setOnClickListener {
 
            copyText(it, binding.editText1)
 
            Toast.makeText(
                [email]this@VolumeFragment.contex[/email]t,
                "Text copied ",
                Toast.LENGTH_LONG
            ).show()
        }
 
        binding.bntCopy2.setOnClickListener {
            copyText(it, binding.editText2)
 
            Toast.makeText(
                [email]this@VolumeFragment.contex[/email]t,
                "Text copied ",
                Toast.LENGTH_LONG
            ).show()
 
        }
 
 
        binding.spinnerFrom.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                adapterView: AdapterView<*>?, view: View?,
                position: Int, id: Long
            ) {
                callConverter()
            }
 
            override fun onNothingSelected(p0: AdapterView<*>?) {
                // NO WAY
            }
 
        }
 
        binding.spinnerTo.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                adapterView: AdapterView<*>?, view: View?,
                position: Int, id: Long
            ) {
                callConverter()
            }
 
            override fun onNothingSelected(p0: AdapterView<*>?) {
                // NO WAY
            }
 
        }
 
 
        viewModel.editTextMessage.value = binding.editText1
 
        viewModel.StringMessageVolume.observe(viewLifecycleOwner) {
 
            if (it.equals("-1")) {
                binding.editText1?.setText("")
            } else if (it.equals("-0")) {
                val cursorPose: Int = binding.editText1.selectionStart
                val textLen: Int = binding.editText1.text.length
 
                if (cursorPose != 0 && textLen != 0) {
                    val selection: SpannableStringBuilder =
                        binding.editText1.text as SpannableStringBuilder
                    selection.replace(cursorPose - 1, cursorPose, "")
                    binding.editText1.setText(selection)
                    binding.editText1.setSelection(cursorPose - 1)
                }
            } else {
                updateString(it)
            }
 
            callConverter()
        }
 
    }
 
 
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentVolumeBinding.inflate(inflater)
 
        return binding.root
    }
 
    override fun onStart() {
        super.onStart()
        callConverter()
    }
 
    override fun onDestroy() {
        super.onDestroy()
        viewModel.StringMessageVolume.value =
            "" // очищаю, шоб после переворота не добавился лишний символ
    }
 
    fun updateString(strToAdd: String) {
        if (strToAdd.isEmpty())
            return
 
        var oldStr: String = binding.editText1?.text.toString()
        val cursorPos: Int = binding.editText1?.selectionStart
        var leftString: String = oldStr.substring(0, cursorPos)
        var rightStr: String = oldStr.substring(cursorPos)
 
        if (binding.editText1.text.toString().equals("")) {
            binding.editText1.setText(strToAdd)
        } else {
            binding.editText1.setText(String.format("%s%s%s", leftString, strToAdd, rightStr))
        }
 
        if (binding.editText1?.text.length <= 13){
            binding.editText1.setSelection(cursorPos + 1)
 
        }
    }
 
    fun callConverter() {
        val type: String = Type
        val from: String = binding.spinnerFrom.selectedItem.toString()
 
        val to: String = binding.spinnerTo.selectedItem.toString()
        val number: String = binding.editText1.text.toString()
        var answer = convert(type, from, to, number)
 
        var response = answer
        if (answer != "")
            response = services.period(answer)
 
 
        binding.editText2.setText(response)
    }
}
Миниатюры
Создание родительского класса для трёх почти одинаковых фрагментов   Создание родительского класса для трёх почти одинаковых фрагментов  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2022, 18:06
Ответы с готовыми решениями:

Повторное создание фрагмента внутри фрагмента ViewPager
Доброго времени суток! Использую внутри фрагмента элемент ViewPager, который сам внутри содержит...

Вырезать фрагмент из wav файла и сохранить этот фрагмент в новый файл.
Добрый день, подскажите плиз как можно вырезать фрагмент из wav и сохранить его в новый wav файл?

Вывод во втором фрагменте длины текста, введённого в первом фрагменте активити
Создать активити с двумя фрагментами. В первый фрагмент должен содержать поле ввода, второй...

16
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
12.10.2022, 18:14
Я не вижу на скринах никаких отличий в разметке, значит можно сделать 1 разметку на все фрагменты.
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
12.10.2022, 18:24  [ТС]
ExFau$t, Разница в том, какой массив лежит в спиннере. А три фрагмента у меня ещё есть, потому что присутствует ViewPager2,чтоб можно было листать их.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
12.10.2022, 18:25
Это один и тот же фрагмент листается, отличаются только данные.
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
12.10.2022, 18:31  [ТС]
ExFau$t, то есть, предлагаешь внутри одного фрагмента просто через when менять содержимое спиннера?)
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
12.10.2022, 18:52
Фрагмент один, но экземпляры класса разные, так что не менять, а засеттить.
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
12.10.2022, 20:12  [ТС]
ExFau$t, вот мой код вьюпейджера, мне просто везде поставить один и тот же фрагмент и в конструктор просто передавать тип нужного конвертера?

Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class ViewPagerAdapter: FragmentStateAdapter{
 
    constructor(activity: AppCompatActivity
    ) : super(activity){
 
    }
 
 
    override fun getItemCount(): Int {
        return items.size
    }
 
 
    override fun createFragment(position: Int): Fragment {
        return items[position]
    }
 
    val items: ArrayList<Fragment> = arrayListOf(
        MoneyFragment(),
        LengthFragment(),
        VolumeFragment()
    )
}
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
12.10.2022, 21:57
Как хочешь, можно и разные сделать с базовым классом, но использующие одну и ту же разметку.
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
13.10.2022, 12:22  [ТС]
ExFau$t, да не, я не совсем понял просто, как создать разные экземляры класса в данном случае
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.10.2022, 12:28
Передавать в ViewPager один и тот же фрагмент с разными аргументами.
1
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
13.10.2022, 13:05  [ТС]
ExFau$t, а, значит, я правильно предлагал, спасибо)
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.10.2022, 13:09
Цитата Сообщение от de1ukc Посмотреть сообщение
значит, я правильно предлагал
Не совсем, в конструкторах фрагментов ничего нельзя передавать, т.к. при пересоздании он будет с пустым конструктором.
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
13.10.2022, 13:40  [ТС]
ExFau$t, Можете,пожалуйста, предложить, каким образом мне передать фрагменты и эти параметры, исходя из кода ViewPager, который я представил выше?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.10.2022, 14:26
Лучший ответ Сообщение было отмечено de1ukc как решение

Решение

Так я же сказал, вместо передачи параметров через конструктор, передавать их через arguments у каждого фрагмента. После создания фрагмента внутри него уже вытаскивать из arguments.
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
16.10.2022, 19:02  [ТС]
ExFau$t, Да, я смог запустить эти разные фрагменты, как ты сказал, только теперь проблема в том, что при изменении на одном фрагменте, всё через LiveData меняется во всех, можете посоветовать, как это пофиксить?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
16.10.2022, 19:05
Ну, очевидно, подписывать их на разные LiveData.
1
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 63
20.10.2022, 17:14  [ТС]
ExFau$t, Забыл ответить, да, я просто создал для каждого фрагмента свою LiveData. Просто мне не нравилось это решением тем, что нужно затем писать when() и писать кейс для каждого объекта, грубо говоря. В зависимости от того, какое поле Type у объекта. (Money,Length или Volume)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.10.2022, 17:14
Помогаю со студенческими работами здесь

Вызов фрагмента из фрагмента с использованием EventBus
Доброго времени суток! Можно ли использовать EventBus для того, что из Фрагмента 1 вызвать...

Вызов фрагмента с RecycleView из другого фрагмента
Добрый день! Написал код, который из одного фрагмента (А) через кнопку вызывает другой фрагмент...

Передача объекта не сериализуемого класса от дочерней Activity к родительской
Уважаемые форумчане, помогите решить проблему. Суть проблемы. Нужно передать объект класса...

Почта под Android: выбрасывается исключение при создании объекта класса URLName
Всем доброго времени суток. Помогите, плз, разобраться с почтой. Моя программа под Андроид должна...

Правильное создание динамического фрагмента с JSON
Господа, есть данный фрагмент, не могу его завести(Отметил ошибки комментариями). Также хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru