Основываясь на ответе @Faisal Naseer. Вот полный пример (с несколькими примечаниями) для использования пользовательского Toolbar
с навигацией и меню в Fragment
frag_home.xml
...
HomeFragment.kt
class HomeFragment : BaseFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
// setHasOptionsMenu(true): don't need this anymore
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar_home.setNavigationIcon(R.drawable.ic_back) // need to set the icon here to have a navigation icon. You can simple create an vector image by "Vector Asset" and using here
toolbar_home.setNavigationOnClickListener {
// do something when click navigation
}
toolbar_home.inflateMenu(R.menu.menu_home)
toolbar_home.setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_add -> {
// do something
true
}
R.id.action_update -> {
// do something
true
}
else -> {
super.onOptionsItemSelected(it)
}
}
}
}
}
menu_home.xml
Надеюсь, это поможет
То, что вы испытываете, является правильным поведением - это нехорошее поведение, но это часть языка. Значение this сбрасывается внутри каждого определения функции . Существует четыре способа вызова функции, для которой используются разные способы установки this.
myFunc (param1, param2);Этот способ вызова функции всегда сбрасывает значение this. к глобальному объекту. Это то, что происходит в вашем случае.
myObj.myFunc (param1, param2);Неудивительно, что это устанавливает «this» для любого объекта, для которого вызывается метод. Здесь "this" == "myObj".
myFunc.apply (myObj, [param1, param2])Это интересный вопрос - здесь this устанавливается для объекта, который вы передаете в качестве первого параметра методу apply - это похоже на вызов метода для объекта, у которого нет этого метода (будьте осторожны, чтобы функция написана так, чтобы она вызывалась). Все функции по умолчанию имеют метод apply.
myNewObj = new MyConstructor (param1, param2);Когда вы вызываете функцию таким образом, «this» инициализируется в новый объект, который наследует методы и свойства от свойства прототипа вашей функции. В этом случае новый объект будет унаследован от MyConstructor.prototype. Кроме того, если вы не вернете значение явно, будет возвращено «this».
Решение, которое вы использовали, является рекомендуемым - присвоить внешнее значение this другой переменной, которая по-прежнему будет видна внутри вашей функции. Единственное, что я бы изменил, это называть переменную «that», как говорит Торок Габор, - это своего рода стандарт де-факто, который может облегчить чтение вашего кода другим программистам.
You are confused about the closures.
For the first problem, yes, you are right, that is the way it can be done. The only difference that there is a convention to name the variable that
that holds this
.
MyClass.prototype.trigger = function(){
var that = this;
window.setTimeout(function(){that.onTimeout();},1000);
}
There is already a nice thread about this on StackOverflow. Check answers for question How does a javascript closure work?.
Your second problem is an exact duplicate of Javascript closure inside loops - simple practical example.