Navigation
基本操作
| <?xml version="1.0" encoding="utf-8"?> |
| <androidx.constraintlayout.widget.ConstraintLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".MainActivity"> |
| |
| <fragment |
| android:id="@+id/fragment" |
| android:name="androidx.navigation.fragment.NavHostFragment" |
| android:layout_width="409dp" |
| android:layout_height="729dp" |
| app:defaultNavHost="true" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:navGraph="@navigation/my_nav_graph" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| package com.example.mynavigation; |
| |
| import androidx.appcompat.app.AppCompatActivity; |
| import androidx.navigation.NavController; |
| import androidx.navigation.Navigation; |
| import androidx.navigation.ui.NavigationUI; |
| |
| import android.os.Bundle; |
| |
| public class MainActivity extends AppCompatActivity { |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.activity_main); |
| |
| |
| NavController controller = Navigation.findNavController(this, R.id.fragment); |
| NavigationUI.setupActionBarWithNavController(this, controller); |
| } |
| |
| @Override |
| public boolean onSupportNavigateUp() { |
| NavController controller = Navigation.findNavController(this, R.id.fragment); |
| return controller.navigateUp(); |
| } |
| } |
| <?xml version="1.0" encoding="utf-8"?> |
| <FrameLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".HomeFragment"> |
| |
| <androidx.constraintlayout.widget.ConstraintLayout |
| android:layout_width="match_parent" |
| android:layout_height="match_parent"> |
| |
| <androidx.constraintlayout.widget.Guideline |
| android:id="@+id/guideline2" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:orientation="horizontal" |
| app:layout_constraintGuide_percent="0.5" /> |
| |
| <TextView |
| android:id="@+id/textView" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="Home" |
| android:textSize="34sp" |
| app:layout_constraintBottom_toTopOf="@+id/guideline2" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.8" /> |
| |
| <Button |
| android:id="@+id/btn_home" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="Button" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="@+id/guideline2" |
| app:layout_constraintVertical_bias="0.2" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| </FrameLayout> |
| package com.example.mynavigation; |
| |
| import android.os.Bundle; |
| |
| import androidx.annotation.Nullable; |
| import androidx.fragment.app.Fragment; |
| import androidx.navigation.NavController; |
| import androidx.navigation.Navigation; |
| |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| public class HomeFragment extends Fragment { |
| |
| |
| public HomeFragment() { |
| |
| } |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| |
| return inflater.inflate(R.layout.fragment_home, container, false); |
| } |
| |
| @Override |
| public void onActivityCreated(@Nullable Bundle savedInstanceState) { |
| super.onActivityCreated(savedInstanceState); |
| getView().findViewById(R.id.btn_home).setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| |
| NavController controller = Navigation.findNavController(view); |
| controller.navigate(R.id.action_homeFragment_to_detailFragment); |
| } |
| }); |
| } |
| } |
| <?xml version="1.0" encoding="utf-8"?> |
| <FrameLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".DetailFragment"> |
| |
| |
| |
| <androidx.constraintlayout.widget.ConstraintLayout |
| android:layout_width="match_parent" |
| android:layout_height="match_parent"> |
| |
| <androidx.constraintlayout.widget.Guideline |
| android:id="@+id/guideline3" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:orientation="horizontal" |
| app:layout_constraintGuide_percent="0.5" /> |
| |
| <TextView |
| android:id="@+id/textView2" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="Detail" |
| android:textSize="34sp" |
| app:layout_constraintBottom_toTopOf="@+id/guideline3" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.8" /> |
| |
| <Button |
| android:id="@+id/btn_detail" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="Button" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="@+id/guideline3" |
| app:layout_constraintVertical_bias="0.2" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| |
| </FrameLayout> |
| package com.example.mynavigation; |
| |
| import android.os.Bundle; |
| |
| import androidx.annotation.Nullable; |
| import androidx.fragment.app.Fragment; |
| import androidx.navigation.Navigation; |
| |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| public class DetailFragment extends Fragment { |
| |
| public DetailFragment() { |
| |
| } |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| |
| return inflater.inflate(R.layout.fragment_detail, container, false); |
| } |
| |
| @Override |
| public void onActivityCreated(@Nullable Bundle savedInstanceState) { |
| super.onActivityCreated(savedInstanceState); |
| getView().findViewById(R.id.btn_detail) |
| .setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_detailFragment_to_homeFragment)); |
| } |
| } |
| <?xml version="1.0" encoding="utf-8"?> |
| <navigation 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" |
| android:id="@+id/my_nav_graph" |
| app:startDestination="@id/homeFragment"> |
| |
| <fragment |
| android:id="@+id/detailFragment" |
| android:name="com.example.mynavigation.DetailFragment" |
| android:label="Detail" |
| tools:layout="@layout/fragment_detail"> |
| <action |
| android:id="@+id/action_detailFragment_to_homeFragment" |
| app:destination="@id/homeFragment" |
| app:enterAnim="@android:anim/fade_in" /> |
| </fragment> |
| <fragment |
| android:id="@+id/homeFragment" |
| android:name="com.example.mynavigation.HomeFragment" |
| android:label="Home" |
| tools:layout="@layout/fragment_home"> |
| <action |
| android:id="@+id/action_homeFragment_to_detailFragment" |
| app:destination="@id/detailFragment" |
| app:enterAnim="@android:anim/slide_in_left" /> |
| </fragment> |
| </navigation> |
转场传值和动画效果
| <?xml version="1.0" encoding="utf-8"?> |
| <navigation 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" |
| android:id="@+id/my_nav_graph" |
| app:startDestination="@id/homeFragment"> |
| |
| <fragment |
| android:id="@+id/homeFragment" |
| android:name="com.example.mynavigation2.HomeFragment" |
| android:label="fragment_home" |
| tools:layout="@layout/fragment_home" > |
| <action |
| android:id="@+id/action_homeFragment_to_detailFragment" |
| app:destination="@id/detailFragment" |
| app:enterAnim="@anim/slide_from_left" /> |
| </fragment> |
| <fragment |
| android:id="@+id/detailFragment" |
| android:name="com.example.mynavigation2.DetailFragment" |
| android:label="fragment_detail" |
| tools:layout="@layout/fragment_detail" > |
| <argument |
| android:name="name" |
| app:argType="string" |
| android:defaultValue="haha" /> |
| </fragment> |
| </navigation> |
| <?xml version="1.0" encoding="utf-8"?> |
| <androidx.constraintlayout.widget.ConstraintLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".MainActivity"> |
| |
| <fragment |
| android:id="@+id/fragmentContainerView" |
| android:name="androidx.navigation.fragment.NavHostFragment" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| app:defaultNavHost="true" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:navGraph="@navigation/my_nav_graph" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| package com.example.mynavigation2; |
| |
| import androidx.appcompat.app.AppCompatActivity; |
| |
| import android.os.Bundle; |
| |
| public class MainActivity extends AppCompatActivity { |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.activity_main); |
| } |
| } |
| <?xml version="1.0" encoding="utf-8"?> |
| <androidx.constraintlayout.widget.ConstraintLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".HomeFragment"> |
| |
| |
| |
| <Button |
| android:id="@+id/button" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="Home" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" /> |
| |
| <EditText |
| android:id="@+id/edt" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:ems="10" |
| android:hint="请输入" |
| android:inputType="textPersonName" |
| android:minHeight="48dp" |
| android:text="Name" |
| app:layout_constraintBottom_toTopOf="@+id/button" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.497" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.895" /> |
| |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| package com.example.mynavigation2; |
| |
| import android.os.Bundle; |
| |
| import androidx.annotation.Nullable; |
| import androidx.fragment.app.Fragment; |
| import androidx.navigation.NavController; |
| import androidx.navigation.Navigation; |
| |
| import android.text.TextUtils; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.EditText; |
| import android.widget.Toast; |
| |
| |
| public class HomeFragment extends Fragment { |
| |
| public HomeFragment() { |
| |
| } |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| |
| return inflater.inflate(R.layout.fragment_home, container, false); |
| } |
| |
| @Override |
| public void onActivityCreated(@Nullable Bundle savedInstanceState) { |
| super.onActivityCreated(savedInstanceState); |
| |
| getView().findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| EditText editText = getView().findViewById(R.id.edt); |
| String str = editText.getText().toString(); |
| if (TextUtils.isEmpty(str)){ |
| Toast.makeText(getActivity(), "请输入内容", Toast.LENGTH_SHORT).show(); |
| return; |
| } |
| |
| Bundle bundle = new Bundle(); |
| bundle.putString("input", str); |
| |
| NavController controller = Navigation.findNavController(view); |
| |
| controller.navigate(R.id.action_homeFragment_to_detailFragment, bundle); |
| } |
| }); |
| } |
| } |
| <?xml version="1.0" encoding="utf-8"?> |
| <androidx.constraintlayout.widget.ConstraintLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".DetailFragment"> |
| |
| <TextView |
| android:id="@+id/textView" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="TextView" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| package com.example.mynavigation2; |
| |
| import android.os.Bundle; |
| |
| import androidx.annotation.Nullable; |
| import androidx.fragment.app.Fragment; |
| |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.TextView; |
| |
| public class DetailFragment extends Fragment { |
| |
| public DetailFragment() { |
| |
| } |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| |
| return inflater.inflate(R.layout.fragment_detail, container, false); |
| } |
| |
| @Override |
| public void onActivityCreated(@Nullable Bundle savedInstanceState) { |
| super.onActivityCreated(savedInstanceState); |
| TextView textView = getView().findViewById(R.id.textView); |
| String str = getArguments().getString("name"); |
| String str2 = getArguments().getString("input"); |
| textView.setText(str2); |
| } |
| } |
| <?xml version="1.0" encoding="utf-8"?> |
| <set xmlns:android="http://schemas.android.com/apk/res/android"> |
| <translate |
| android:fromXDelta="-100%" |
| android:toXDelta="0%" |
| android:duration="1000"/> |
| </set> |
使用viewmodel和databinding
| implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' |
| dataBinding{ enabled true} |
- 将xml改成databing风格才会自动生成binding类
- nav_graph.xml
| <?xml version="1.0" encoding="utf-8"?> |
| <navigation 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" |
| android:id="@+id/nav_graph" |
| app:startDestination="@id/masterFragment2"> |
| <fragment |
| android:id="@+id/masterFragment2" |
| android:name="com.example.mynavigation3.MasterFragment" |
| android:label="fragment_master" |
| tools:layout="@layout/fragment_master" > |
| <action |
| android:id="@+id/action_masterFragment2_to_detailFragment3" |
| app:destination="@id/detailFragment3" /> |
| </fragment> |
| <fragment |
| android:id="@+id/detailFragment3" |
| android:name="com.example.mynavigation3.DetailFragment" |
| android:label="fragment_detail" |
| tools:layout="@layout/fragment_detail" > |
| <action |
| android:id="@+id/action_detailFragment3_to_masterFragment2" |
| app:destination="@id/masterFragment2" /> |
| </fragment> |
| </navigation> |
| <?xml version="1.0" encoding="utf-8"?> |
| <androidx.constraintlayout.widget.ConstraintLayout 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" |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".MainActivity"> |
| |
| <androidx.fragment.app.FragmentContainerView |
| android:id="@+id/fragmentContainerView" |
| android:name="androidx.navigation.fragment.NavHostFragment" |
| android:layout_width="409dp" |
| android:layout_height="729dp" |
| app:defaultNavHost="true" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:navGraph="@navigation/nav_graph" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| package com.example.mynavigation3; |
| |
| import androidx.appcompat.app.AppCompatActivity; |
| |
| import android.os.Bundle; |
| |
| public class MainActivity extends AppCompatActivity { |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.activity_main); |
| } |
| } |
| <?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"> |
| |
| <data> |
| <variable |
| name="data" |
| type="com.example.mynavigation3.MyViewModel" /> |
| |
| </data> |
| |
| <androidx.constraintlayout.widget.ConstraintLayout |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".MasterFragment"> |
| |
| <TextView |
| android:id="@+id/tv1" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@{String.valueOf(data.number)}" |
| android:textSize="34sp" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.498" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.358" /> |
| |
| <Button |
| android:id="@+id/btn_next" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="下个页面" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.498" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.612" /> |
| |
| <SeekBar |
| android:id="@+id/seekBar" |
| android:layout_width="0dp" |
| android:layout_height="wrap_content" |
| android:max="10" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| </layout> |
| package com.example.mynavigation3; |
| |
| import android.os.Bundle; |
| |
| import androidx.databinding.DataBindingUtil; |
| import androidx.fragment.app.Fragment; |
| import androidx.fragment.app.FragmentManager; |
| import androidx.lifecycle.ViewModelProviders; |
| import androidx.navigation.NavController; |
| import androidx.navigation.Navigation; |
| |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.SeekBar; |
| |
| import com.example.mynavigation3.databinding.FragmentMasterBinding; |
| |
| public class MasterFragment extends Fragment { |
| |
| public MasterFragment() { |
| |
| } |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| MyViewModel myViewModel; |
| myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class); |
| FragmentMasterBinding binding; |
| binding = DataBindingUtil.inflate(inflater, R.layout.fragment_master, container, false); |
| binding.setData(myViewModel); |
| binding.setLifecycleOwner(getActivity()); |
| |
| binding.btnNext.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| NavController controller = Navigation.findNavController(view); |
| controller.navigate(R.id.action_masterFragment2_to_detailFragment3); |
| } |
| }); |
| binding.seekBar.setProgress(myViewModel.getNumber().getValue()); |
| binding.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { |
| @Override |
| public void onProgressChanged(SeekBar seekBar, int i, boolean b) { |
| myViewModel.getNumber().setValue(i); |
| } |
| |
| @Override |
| public void onStartTrackingTouch(SeekBar seekBar) { |
| |
| } |
| |
| @Override |
| public void onStopTrackingTouch(SeekBar seekBar) { |
| |
| } |
| }); |
| |
| |
| return binding.getRoot(); |
| |
| } |
| } |
| <?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"> |
| |
| <data> |
| <variable |
| name="data" |
| type="com.example.mynavigation3.MyViewModel" /> |
| |
| </data> |
| |
| <androidx.constraintlayout.widget.ConstraintLayout |
| android:layout_width="match_parent" |
| android:layout_height="match_parent" |
| tools:context=".DetailFragment"> |
| |
| |
| <TextView |
| android:id="@+id/tv2" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="@{String.valueOf(data.number)}" |
| android:textSize="34sp" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.498" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.31" /> |
| |
| <Button |
| android:id="@+id/btn_add" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="+" |
| android:onClick="@{()->data.add(1)}" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.208" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" /> |
| |
| <Button |
| android:id="@+id/btn_minus" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="-" |
| android:onClick="@{()->data.add(-1)}" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.782" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.499" /> |
| |
| <Button |
| android:id="@+id/btn_previous" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:text="上个界面" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintHorizontal_bias="0.501" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintVertical_bias="0.653" /> |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| </layout> |
| package com.example.mynavigation3; |
| |
| import android.os.Bundle; |
| |
| import androidx.databinding.DataBindingUtil; |
| import androidx.fragment.app.Fragment; |
| import androidx.lifecycle.ViewModelProviders; |
| import androidx.navigation.NavController; |
| import androidx.navigation.Navigation; |
| |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| import com.example.mynavigation3.databinding.FragmentDetailBinding; |
| |
| public class DetailFragment extends Fragment { |
| |
| public DetailFragment() { |
| |
| } |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, |
| Bundle savedInstanceState) { |
| MyViewModel myViewModel; |
| myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class); |
| FragmentDetailBinding binding; |
| binding = DataBindingUtil.inflate(inflater, R.layout.fragment_detail, container, false); |
| binding.setData(myViewModel); |
| binding.setLifecycleOwner(getActivity()); |
| |
| binding.btnPrevious.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| NavController controller = Navigation.findNavController(view); |
| controller.navigate(R.id.action_detailFragment3_to_masterFragment2); |
| } |
| }); |
| return binding.getRoot(); |
| |
| |
| } |
| } |
| package com.example.mynavigation3; |
| |
| import androidx.lifecycle.MutableLiveData; |
| import androidx.lifecycle.ViewModel; |
| |
| public class MyViewModel extends ViewModel { |
| private MutableLiveData<Integer> number; |
| |
| public MutableLiveData<Integer> getNumber() { |
| if (number == null){ |
| number = new MutableLiveData<>(); |
| number.setValue(0); |
| } |
| return number; |
| } |
| |
| public void add(int n){ |
| if (number.getValue() < 0){ |
| number.setValue(0); |
| } else { |
| number.setValue(number.getValue() + n); |
| } |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步