安卓基础(页面导航传递数据)

Posted doublebest1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓基础(页面导航传递数据)相关的知识,希望对你有一定的参考价值。

今天学习了关于页面导航数据传递的知识,它可以有三种方法,前两种比较适合传递静态数据,最后一种则是复杂的动态数据传递。下面我来一次说一下三种方法:

第一种:打开新建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截图:

 

以上是关于安卓基础(页面导航传递数据)的主要内容,如果未能解决你的问题,请参考以下文章

使用导航从工具栏菜单项单击在片段之间传递数据 - Kotlin

通过导航组件在底部导航片段之间传递数据

如何在导航抽屉中的两个片段之间传递数据

如何在底部导航片段(或导航抽屉)之间传递数据?

将数据从活动传递到底部导航栏的片段

通过片段之间的导航传递数据android studio