今天学习了关于页面导航数据传递的知识,它可以有三种方法,前两种比较适合传递静态数据,最后一种则是复杂的动态数据传递。下面我来一次说一下三种方法:
第一种:打开新建navigation文件夹中的xml的图形界面。
在图形界面中点击一个界面,然后右边的Arguments是参数的意思,点击加号就可以创建参数。
之后再页面得java文件中,getArArguments()获取参数,然后再界面输出就可以了。
String s = getArguments().getString("name"); TextView textView = getView().findViewById(R.id.textView); textView.setText(s);
第二种:点击页面连接线,即上图得连线,在右边Argument Default Values 中设置参数值,直接可以和第二种方法一样,在末端界面获取参数值来输出。
但是需要注意,我在连线的初始界面对按钮的监听,中用的是action,即R.id.action....。
getView().findViewById(R.id.button).setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_home_Fragment_to_detail_Fragment));
如果直接像下面一样,R.id.末端页面。界面点击按钮依然可以跳转,但是未激活那条连线的函数,获取不到参数值。
getView().findViewById(R.id.button).setOnClickListener(Navigation.createNavigateOnClickListener(R.id.detail_Fragment));
第三种:我用我的实例来说明第三种方法。我在初始界面上设置了一个输入框,然后点击按钮,将输入值传入到第二个跳转界面之中。
Home_Fragment:获取edittext的输入值,创建Bundle对象,将输入值传过去。
package com.example.navigation;Bu import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.navigation.NavController; import androidx.navigation.Navigation; /** * A simple {@link Fragment} subclass. */ public class Home_Fragment extends Fragment { public Home_Fragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment 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 v) { EditText editText = getView().findViewById(R.id.editText); String s = editText.getText().toString(); if(TextUtils.isEmpty(s)){ Toast.makeText(getActivity(),"请输入名字",Toast.LENGTH_SHORT).show(); return ; } Bundle bundle = new Bundle(); bundle.putString("myname",s); NavController controller = Navigation.findNavController(v); controller.navigate(R.id.action_home_Fragment_to_detail_Fragment,bundle); } }); } }
Detail_Fragment:获取参数值,在页面输出。
package com.example.navigation;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.navigation.Navigation;
import javax.xml.namespace.QName;
/**
* A simple {@link Fragment} subclass.
*/
public class Detail_Fragment extends Fragment {
public Detail_Fragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_detail_, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String s = getArguments().getString("myname");
TextView textView = getView().findViewById(R.id.textView);
textView.setText(s);
// String s = getArguments().getString("name");
// TextView textView = getView().findViewById(R.id.textView);
// textView.setText(s);
}
}
Main_Activity:设置末端页面的返回箭头,令其点击箭头可返回上一级。
package com.example.navigation; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import androidx.navigation.NavController; import androidx.navigation.Navigation; import androidx.navigation.ui.NavigationUI; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NavController navController =Navigation.findNavController(this,R.id.fragment); NavigationUI.setupActionBarWithNavController(this,navController); } @Override public boolean onSupportNavigateUp() { NavController navController = Navigation.findNavController(this,R.id.fragment); return navController.navigateUp(); } }
Home_Detail截图: