在 "活动 "或 "片段 "之间传递数据是你开始做安卓开发时需要学习的基本概念之一。尽管 "活动 "和 "片段 "只不过是类,但它们在android中被认为是特殊的类,因为它们是android用户界面工作的基础。因此,我们不只是通过构造函数向它们传递数据,而是通过以下三种方式之一。

    1. "Intent"。
    1. "捆绑"(Bundle)。
  1. 视图模型

在这一课中,我们将用实际的例子来研究所有这些。让我们开始吧。

例子1: 安卓数据传递–通过 "Intent "将 "Fragment "传递给 "Activity"。

让我们继续之前开始的安卓数据传递系列。我们已经研究了如何从 "活动 "到 "片段 "传递数据,如何从 "活动 "到 "活动 "传递列表/对象,以及简单的原始数据类型。

今天我们看看如何从fragmentactivity传递简单的数据类型。我们通过Intent对象传递数据。

什么是 "fragment"?

一个fragment'是一个有自己生命周期的子活动。片段由 "活动 "托管。一个活动’可以承载多个`片段’。

为什么要将数据从 "片段 "传递到 "活动"?

编号 原因
1.|片段是子活动,允许我们拥有不同的屏幕,而不一定要创建许多 "活动"。因此,我们需要知道如何将数据从 "片段 "传递到 "活动 "中。
2. 活动这样的片段是代表一个窗口的特殊UI类,因此我们不能像对普通类那样直接传递数据。

简介

  • 我们有两个类:一个是我们的MainActivity,另一个是MyFragment类。
  • 当我们按下FAB(Floating Action Button)按钮时,我们通过`Fragment’事务打开MyFragment,将其附加到我们将定义的FrameLayout上。
  • `Fragment’包含一个编辑文本和一个旋转器。
  • 用户输入航天器名称,并在旋转器中选择发射年份。
  • 然后我们将这两个数据传回给MainActivity。
  • 然后在文本视图中显示收到的数据。
  • 我们使用了Android Studio作为我们的IDE。
  • 该代码有很好的注释,以便于理解。

我们回答的常见问题

通过这个简单的例子,我们探讨了以下问题。

  • 如何从fragment传递数据到一个activity
  • 如何使用intents在fragmentactivity之间传递数据。
  • 我如何执行FragmentTransaction.
  • 覆盖onResume()并在android中接收数据。
  • 如何同时处理fragment和[activity](https://camposha.info/android/activity)。

使用的工具

  • IDE : Android Studio
  • 操作系统 : Windows 8.1
  • 平台 : Android
  • 语言:Java
  • 主题 : Intent',数据传递,Fragment’。

我们开始吧。

让我们看一下源代码。

1. `Build.gradle

  • 不需要外部依赖。

2. MainActivity.java

  • 我们的MainActivity,启动器activity
  • 首先我们在这里引用视图,在这里是简单的文本视图来显示我们收到的数据。
  • 我们有一个方法:receiveData(),负责接收和解压我们从MyFragment类收到的数据。
  • 我们将在onResume()方法中接收数据。
  • 因为该方法不仅在我们从fragment恢复时被调用,而且在activity被创建和启动后被调用,我们将需要使用一个简单的发送者字符串来识别调用者,我们将在每次从fragment发送数据时发送。
  • 如果发送者是`MyFragment’,那么我们就去解压我们的数据。

package com.tutorials.hp.datafragment_activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView nameTxt,yearTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    //REFERENCE VIEWS
        nameTxt= (TextView) findViewById(R.id.nameTxt);
        yearTxt= (TextView) findViewById(R.id.yearTxt);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              openFragment();
            }
        });
    }
/*
WHEN ACTIVITY RESUMES
*/
    @Override
    protected void onResume() {
        super.onResume();

    //DETERMINE WHO STARTED THIS ACTIVITY
    final String sender=this.getIntent().getExtras().getString("SENDER_KEY");

    //IF ITS THE FRAGMENT THEN RECEIVE DATA
        if(sender != null)
        {
            this.receiveData();
            Toast.makeText(this, "Received", Toast.LENGTH_SHORT).show();

        }
    }

    /*
        OPEN FRAGMENT
         */
    private void openFragment()
    {
        //PASS OVER THE BUNDLE TO OUR FRAGMENT
        MyFragment myFragment = new MyFragment();
        //THEN NOW SHOW OUR FRAGMENT
        getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();
    }

    /*
    RECEIVE DATA FROM FRAGMENT
     */
    private void receiveData()
    {
        //RECEIVE DATA VIA INTENT
        Intent i = getIntent();
        String name = i.getStringExtra("NAME_KEY");
        int year = i.getIntExtra("YEAR_KEY",0);

        //SET DATA TO TEXTVIEWS
        nameTxt.setText(name);
        yearTxt.setText(String.valueOf(year));
    }
}

3. MyFragment.java

  • 我们的`Fragment’类。
  • 我们正在使用支持库Fragment,所以我们扩展了android.support.v4.app.Fragment`。
  • 这里我们有一个编辑文本,一个按钮和一个旋转器。
  • 用户应在编辑文本中输入航天器名称,在旋转器中选择发射年份,然后点击发送按钮,将数据发送到MainActivity。
  • 我们在 "意图 "中发送和打包数据。
  • 我们还发送一个我们称之为sender的变量,以确定该数据的发送者是这个`fragment’。

package com.tutorials.hp.datafragment_activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

/
 * A simple Fragment subclass.
 */
public class MyFragment extends Fragment {

    private EditText nameFragTxt;
    private Spinner launchYearSpinner;
    private Button sendBtn;

    public MyFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View rootView=inflater.inflate(R.layout.fragment_my, container, false);

        //INITIALIZE VIEWS
        nameFragTxt = (EditText)rootView.findViewById(R.id.nameEditTxt);
        launchYearSpinner = (Spinner)rootView.findViewById(R.id.sp);
        sendBtn = (Button) rootView.findViewById(R.id.sendBtn);

        fillYears();

        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendData();
            }
        });

        return rootView;
    }
    /*
    FILL YEARS IN OUR SPINNER
    */
    private void fillYears() {
        ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1);
        adapter.add("2017");
        adapter.add("2018");
        adapter.add("2019");
        adapter.add("2020");
        adapter.add("2021");
        adapter.add("2022");

        //SET ADAPTER INSTANCE TO OUR SPINNER
        launchYearSpinner.setAdapter(adapter);

    }

    private void sendData()
    {
        //INTENT OBJ
        Intent i = new Intent(getActivity().getBaseContext(),
                MainActivity.class);

        //PACK DATA
    i.putExtra("SENDER_KEY", "MyFragment");
        i.putExtra("NAME_KEY", nameFragTxt.getText().toString());
        i.putExtra("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));

        //RESET WIDGETS
        nameFragTxt.setText("");
        launchYearSpinner.setSelection(0);

        //START ACTIVITY
        getActivity().startActivity(i);
    }
}

4. 创建用户接口

用户界面通常是在android中使用XML布局来创建的,而不是直接用java编码。

这是一个声明式编程的例子。

使用XML而不是Java的优势
编号 优势
1. 声明式地创建部件和视图,使我们能够使用声明式语言XML,这使我们更容易。
2. 它很容易维护,因为用户界面是与你的Java逻辑解耦的。
3. 它更容易分享或下载代码,并在运行前安全地测试它们。
4. 你可以使用XML生成工具来生成XML

下面是我们这个项目的布局。

(a). activity_main.xml
  • 这个布局被膨胀为MainActivity的用户界面。
  • 它包括content_main.xml。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_fitsSystemWindows="true"
    tools_context="com.tutorials.hp.datafragment_activity.MainActivity">

    <android.support.design.widget.AppBarLayout
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android_id="@+id/toolbar"
            android_layout_width="match_parent"
            android_layout_height="?attr/actionBarSize"
            android_background="?attr/colorPrimary"
            app_popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.widget.FloatingActionButton
        android_id="@+id/fab"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_gravity="bottom|end"
        android_layout_margin="@dimen/fab_margin"
        app_srcCompat="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

下面是一些被采用的小部件、视图和视图组"

编号 视图/视图组 角色
1. CordinatorLayout android.support.design.widget 超级强大的框架布局,提供了我们应用程序的顶层装饰,也指定了它所有子节点的交互和行为。
AppBarLayout android.support.design.widget 一个LinearLayout子节点,垂直排列其子节点,并提供材料设计的应用栏概念,如滚动手势。
3. ToolBar <android.support.v7.widget 一个ViewGroup,可以提供动作条的功能,但仍然可以在应用程序布局中使用。
4. 浮动动作按钮 android.support.design.widget 一个漂浮在UI上方的圆形图像视图,我们可以将其作为按钮使用。
(b). content_main.xml

这个布局被包含在你的 activity_main.xml 中。
我们在这里定义我们的UI部件。

  • 主布局。
  • 我们在这里指定视图和widgets xml代码。
  • 这个布局将被膨胀到我们的MainActivity界面中。
  • 是我们项目中的contentmain.xml布局。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    android_id="@+id/content_main"
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_paddingBottom="@dimen/activity_vertical_margin"
    android_paddingLeft="@dimen/activity_horizontal_margin"
    android_paddingRight="@dimen/activity_horizontal_margin"
    android_paddingTop="@dimen/activity_vertical_margin"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.datafragment_activity.MainActivity"
    tools_showIn="@layout/activity_main">

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="vertical"
        android_layout_height="match_parent">

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Received Data"
        android_id="@+id/activityTitle"
        android_textStyle="bold"
        android_textColor="@color/colorAccent"
        android_layout_gravity="center_horizontal"
        android_padding="5dp"
        />

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Name"
        android_id="@+id/nameTxt"
        android_padding="5dp"
        />

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Year"
        android_id="@+id/yearTxt"
        android_padding="5dp"
        />

    <FrameLayout
        android_id="@+id/container"
        android_layout_width="match_parent"
        android_layout_height="wrap_content">

    </FrameLayout>

    </LinearLayout>
</RelativeLayout>

(c). MyFragment布局

  • 为我们的`Fragment’类设计的布局。
  • 包含一个带有编辑文本和旋转器的CardView。
  • 是我们项目中的fragment_my.xml布局

<FrameLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    tools_context="com.tutorials.hp.datafragment_activity.MyFragment">
    <android.support.v7.widget.CardView
        android_orientation="horizontal"
        android_layout_width="match_parent"

        android_layout_margin="5dp"
        card_view_cardCornerRadius="10dp"
        card_view_cardElevation="5dp"
        android_layout_height="300dp">

        <LinearLayout
            android_orientation="vertical"
            android_layout_width="match_parent"
            android_layout_height="match_parent">
            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="FRAGMENT ONE"
                android_id="@+id/fragTitle"
                android_textStyle="bold"
                android_textColor="@color/colorAccent"
                android_layout_gravity="center_horizontal"
                android_padding="5dp"
                />

            <android.support.design.widget.TextInputLayout
                android_id="@+id/nameLayout"
                android_layout_width="match_parent"
                android_layout_height="wrap_content">

                <EditText
                    android_id="@+id/nameEditTxt"
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"
                    android_singleLine="true"
                    android_hint= "Name" />
            </android.support.design.widget.TextInputLayout>

            <LinearLayout
                android_layout_width="match_parent"
                android_orientation="horizontal"
                android_layout_height="wrap_content">
                <TextView
                    android_text="LAUNCH YEAR : "
                    android_textColor="@color/colorAccent"
                    android_layout_width="wrap_content"
                    android_layout_height="wrap_content" />
                <Spinner
                    android_id="@+id/sp"
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"
                    />
            </LinearLayout>

            <Button
                android_id="@+id/sendBtn"
        android_text="Send"
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"             />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</FrameLayout>

如何运行

  • 下载上面的项目。
  • 你会得到一个压缩文件,解压它。
  • 打开Android Studio。
  • 现在关闭任何已经打开的项目
  • 从菜单栏点击文件>新建>导入项目
  • 现在选择一个目标文件夹,你想从那里导入项目。
  • 选择一个Android项目。
    现在点击 "OK"。
    完成了,你完成了导入项目,现在编辑它。

结果

以下是你将得到的结果。

如何将数据从<code>fragment</code>传递到<code>activity</code>

更多资源

资源 链接
GitHub 浏览 浏览
GitHub下载链接 下载

示例2:Android数据传递–通过 "捆绑 "从 "活动 "到 "碎片"。

当开发任何不是Hello World的应用程序时,你有可能需要有一个以上的`Activity’或Fragments。Fragments基本上是子活动。

大多数新手对在 "活动 "和 "片段 "之间传递数据感到困惑。

今天我们想看看如何将数据从一个活动'传递到一个片段’。我们将使用一个 "Bundle "对象,在我们的 "Activity "中打包数据,然后在 "Fragment "的onCreateView()方法中解包数据。

第1步:创建项目

  1. 首先在android studio中创建一个新项目。转到文件–>新项目。
  2. 2.输入应用程序的名称并选择公司名称。
  3. 选择最小的SDK。
  4. 选择空或基本活动
  5. 点击完成。

第2步:我们的Build.gradle

  • 我们将在我们的`Fragment’中使用CardView。不需要外部依赖。

第3步:我们的 "Fragment"。

  • 将从我们的 "fragment "布局中膨胀出来。
  • 我们将简单地接收来自MainActivity的数据,并在我们的 "fragment "内的视图中显示它们。
  • 我们在onCreateView()方法中解压数据。

package com.tutorials.hp.dataactivity_fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyFragment extends Fragment {

    private TextView nameFragTxt,yearFragTxt;

    public MyFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView=inflater.inflate(R.layout.fragment_my, container, false);

        nameFragTxt= (TextView) rootView.findViewById(R.id.nameTxt);
        yearFragTxt= (TextView) rootView.findViewById(R.id.yearTxt);

        //UNPACK OUR DATA FROM OUR BUNDLE
        String name=this.getArguments().getString("NAME_KEY").toString();
        int year=this.getArguments().getInt("YEAR_KEY");

       nameFragTxt.setText("NAME : "+name);
       yearFragTxt.setText("YEAR : "+String.valueOf(year));

        return rootView;
    }

}

第四步:我们的MainActivity

  • 应从我们的contentmain.xml中膨胀出来
  • 当用户点击浮动的动作按钮时,我们将用户在edittext和spinner中输入的数据打包到一个Bundle对象中。
  • 然后我们执行Fragment'事务,用充气的fragment’取代我们的Framelayout容器。
  • 我们将捆绑包发送到Fragment

package com.tutorials.hp.dataactivity_fragment;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;

public class MainActivity extends AppCompatActivity {
    private EditText nameTxt;
    private Spinner launchYearSpinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //INITIALIZE VIEWS
        nameTxt = (EditText) findViewById(R.id.nameEditTxt);
        launchYearSpinner = (Spinner) findViewById(R.id.sp);

        fillYears();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendData();
            }
        });
    }

    /*
    SEND DATA TO FRAGMENT
     */
    private void sendData() {
        //PACK DATA IN A BUNDLE
        Bundle bundle = new Bundle();
        bundle.putString("NAME_KEY", nameTxt.getText().toString());
        bundle.putInt("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));

        //PASS OVER THE BUNDLE TO OUR FRAGMENT
        MyFragment myFragment = new MyFragment();
        myFragment.setArguments(bundle);

        nameTxt.setText("");
        launchYearSpinner.setSelection(0);

        //THEN NOW SHOW OUR FRAGMENT
        getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();

    }

    /*
    FILL YEARS IN OUR SPINNER
     */
    private void fillYears() {
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
        adapter.add("2017");
        adapter.add("2018");
        adapter.add("2019");
        adapter.add("2020");
        adapter.add("2021");
        adapter.add("2022");

        //SET ADAPTER INSTANCE TO OUR SPINNER
        launchYearSpinner.setAdapter(adapter);
    }
}

第5步。创建Activity用户界面

在android中,用户界面通常是用XML布局来创建的,而不是直接用java编码。

这是一个声明式编程的例子。

使用XML而不是Java的优势

编号 优势
1. 声明性地创建部件和视图,使我们能够使用声明性语言XML,这使我们更容易。
2. 它很容易维护,因为用户界面是与你的Java逻辑解耦的。
3. 它更容易分享或下载代码,并在运行前安全地测试它们。
4. 你可以使用XML生成工具来生成XML

下面是我们这个项目的布局。

(a). activity_main.xml
  • 这个布局被膨胀为MainActivity的用户界面。
  • 它包括content_main.xml。

下面是一些被采用的小部件、视图和视图组"

| 编号 | 视图/视图组 | 包装 | 角色

| CordinatorLayout | android.support.design.widget | 超级强大的framelayout,提供了我们应用程序的顶层装饰,也指定了所有子程序的交互和行为。|
| AppBarLayout | android.support.design.widget | 一个LinearLayout子节点,垂直排列其子节点,并提供材料设计的应用栏概念,如滚动手势。|
| 3. | ToolBar | <android.support.v7.widget | 一个ViewGroup,可以提供动作条的功能,但仍然可以在应用程序布局中使用。|
| 4. | 浮动行动按钮 | android.support.design.widget | 一个漂浮在用户界面上的圆形图像视图,我们可以将其作为按钮使用。|

(b). content_main.xml

这个布局被包含在你的 activity_main.xml 中。
我们在这里定义我们的UI部件。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_paddingBottom="@dimen/activity_vertical_margin"
    android_paddingLeft="@dimen/activity_horizontal_margin"
    android_paddingRight="@dimen/activity_horizontal_margin"
    android_paddingTop="@dimen/activity_vertical_margin"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.dataactivity_fragment.MainActivity"
    tools_showIn="@layout/activity_main">

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="vertical"
        android_layout_height="match_parent">

        <android.support.design.widget.TextInputLayout
            android_id="@+id/nameLayout"
            android_layout_width="match_parent"
            android_layout_height="wrap_content">

            <EditText
                android_id="@+id/nameEditTxt"
                android_layout_width="match_parent"
                android_layout_height="wrap_content"
                android_singleLine="true"
                android_hint= "Name" />
        </android.support.design.widget.TextInputLayout>

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="horizontal"
        android_layout_height="wrap_content">
        <TextView
            android_text="LAUNCH YEAR : "
            android_textColor="@color/colorAccent"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content" />
        <Spinner
            android_id="@+id/sp"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            />
        </LinearLayout>
        <FrameLayout
            android_id="@+id/container"
            android_layout_width="match_parent"
            android_layout_height="wrap_content">
        </FrameLayout>
    </LinearLayout>
</RelativeLayout>

第6步:我们的fragmentxml

  • 我们的 "fragment "布局。
  • 应包含一个带有文本视图的CardView。

<RelativeLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    tools_context="com.tutorials.hp.dataactivity_fragment.MyFragment">

    <android.support.v7.widget.CardView
        android_orientation="horizontal"
        android_layout_width="match_parent"

        android_layout_margin="5dp"
        card_view_cardCornerRadius="10dp"
        card_view_cardElevation="5dp"
        android_layout_height="300dp">

        <LinearLayout
            android_orientation="vertical"
            android_layout_width="match_parent"
            android_layout_height="match_parent">

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="FRAGMENT ONE"
                android_id="@+id/fragTitle"
                android_textStyle="bold"
                android_textColor="@color/colorAccent"
                android_layout_gravity="center_horizontal"
                android_padding="5dp"
                 />

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Name"
                android_id="@+id/nameTxt"
                android_padding="5dp"
                />

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Year"
                android_id="@+id/yearTxt"
                android_padding="5dp"
                />

        </LinearLayout>
    </android.support.v7.widget.CardView>

</RelativeLayout>

第7步:如何运行

  • 下载该项目。
  • 你会得到一个压缩文件,解开它。
  • 打开Android Studio。
  • 现在关闭,任何已经打开的项目
  • 从菜单栏点击文件>新建>导入项目
  • 现在选择一个目标文件夹,你想从那里导入项目。
  • 选择一个Android项目。
    现在点击 "OK"。
    完成了,现在编辑它。

结果

这就是你得到的结果。

如何将数据从<code>活动</code>传递到<code>碎片</code>

第8步:更多

资源 链接
GitHub 浏览 浏览
GitHub下载链接 下载

Android数据传递:ListView到ListView

有时你可能想把数据从ActivityA中的一个列表视图传递给ActivityB中的列表视图,这就是本教程的目的。

我们将有两个活动,每个都有一个ListView。我们点击一个按钮,将数据从第一个活动传递到第二个活动,将第一个litsview传递到第二个listview。

Gradle脚本

让我们修改我们的build.gradle文件的应用程序级别。

1. Build.gradle

  • 我们在dependencies闭合项下指定依赖项。

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        defaultConfig {
            applicationId "com.tutorials.hp.listviewdatapassing"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:25.2.0'
        compile 'com.android.support:design:25.2.0'
        testCompile 'junit:junit:4.12'
    }

LAYOUTS

我们将有三个布局。

1. activity_main.xml

  • 这个布局将被充实到我们的mainactivity的用户界面中。
  • 它将容纳content_main.xml布局。
  • 它包含了我们的appbar和toolbar的定义。

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout

        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_fitsSystemWindows="true"
        tools_context="com.tutorials.hp.listviewdatapassing.MainActivity">

        <android.support.design.widget.AppBarLayout
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android_id="@+id/toolbar"
                android_layout_width="match_parent"
                android_layout_height="?attr/actionBarSize"
                android_background="?attr/colorPrimary"
                app_popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

        <include layout="@layout/content_main" />

        <android.support.design.widget.FloatingActionButton
            android_id="@+id/fab"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_gravity="bottom|end"
            android_layout_margin="@dimen/fab_margin"
            app_srcCompat="@android:drawable/ic_dialog_email" />

    </android.support.design.widget.CoordinatorLayout>

2. content_main.xml

  • 这将包含我们的第一个列表视图。
  • 这个布局被包含在activity_main.xml中。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout

        android_id="@+id/content_main"
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_paddingBottom="@dimen/activity_vertical_margin"
        android_paddingLeft="@dimen/activity_horizontal_margin"
        android_paddingRight="@dimen/activity_horizontal_margin"
        android_paddingTop="@dimen/activity_vertical_margin"
        app_layout_behavior="@string/appbar_scrolling_view_behavior"
        tools_context="com.tutorials.hp.listviewdatapassing.MainActivity"
        tools_showIn="@layout/activity_main">

        <ListView
            android_id="@+id/firstLV"
            android_layout_width="match_parent"
            android_layout_height="wrap_content" />
    </RelativeLayout>

3. activity_second.xml

  • 这个布局将被充实到我们第二个`活动’的用户界面中。
  • 它将容纳第二个`活动’。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout

        android_id="@+id/activity_second"
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_paddingBottom="@dimen/activity_vertical_margin"
        android_paddingLeft="@dimen/activity_horizontal_margin"
        android_paddingRight="@dimen/activity_horizontal_margin"
        android_paddingTop="@dimen/activity_vertical_margin"
        tools_context="com.tutorials.hp.listviewdatapassing.SecondActivity">
        <ListView
            android_id="@+id/secondLV"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            />
    </RelativeLayout>

JAVA类

下面是我们的JAVA类。

1. SpacecraftsCollection

  • 这个类将帮助我们把ArrayList从第一个活动转移到第二个活动。这个类将被序列化,转移,然后在第二个 "活动 "中被反序列化。

    package com.tutorials.hp.listviewdatapassing;

    import java.io.Serializable;
    import java.util.ArrayList;

    public class SpacecraftsCollection implements Serializable {

        private ArrayList<String> spacecrafts;

        public ArrayList<String> getSpacecrafts() {
            return spacecrafts;
        }

        public void setSpacecrafts(ArrayList<String> spacecrafts) {
            this.spacecrafts = spacecrafts;
        }
    }

2. SecondActivity.java

*这是我们的第二个`活动’类。

  • 它将接收一个包含我们的航天器的序列化数组,并将其反序列化并显示在第二个列表视图中。

    package com.tutorials.hp.listviewdatapassing;

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    public class SecondActivity extends AppCompatActivity {

        //SECOND LISTVIEW
        ListView lv;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);

            lv= (ListView) findViewById(R.id.secondLV);

            receiveData();
        }

        /*
        RECEIVE DATA FROM FIRST ACTIVITY
         */
        private void receiveData()
        {
            Intent i=this.getIntent();
            SpacecraftsCollection spacecraftsCollection= (SpacecraftsCollection) i.getSerializableExtra("SPACECRAFTS");

            lv.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,spacecraftsCollection.getSpacecrafts()));
        }
    }

3. MainActivity.java

  • 我们的MainActivity类。
  • 当浮动的动作按钮被点击时,我们的数组列表数据将从这里转移到第二个`活动’。

    package com.tutorials.hp.listviewdatapassing;

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity {

        //FIRST LISTVIEW
        ListView lv;
        ArrayList spacecrafts=new ArrayList();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            lv= (ListView) findViewById(R.id.firstLV);
            populateData();
            lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,spacecrafts));

            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>()));
                    sendData();
                }
            });
        }

        //POPULATE SPACECRAFTS ARRAYLIST
        private void populateData()
        {
            spacecrafts.add("Casini");
            spacecrafts.add("Enterprise");
            spacecrafts.add("Spitzer");
            spacecrafts.add("Huygens");
            spacecrafts.add("WMAP");
            spacecrafts.add("Juno");
            spacecrafts.add("Kepler");
            spacecrafts.add("Apollo 15");
            spacecrafts.add("Challenger");
            spacecrafts.add("Discovery");
        }

        /*
        SET ARRAYLIST TO SPACECRAFTS COLLECTION CLASS
         */
        private SpacecraftsCollection getData()
        {
            SpacecraftsCollection spacecraftsCollection=new SpacecraftsCollection();
            spacecraftsCollection.setSpacecrafts(spacecrafts);

            return spacecraftsCollection;
        }

        /*
        SEND DATA TO SECOND ACTIVITY
         */
        private void sendData()
        {
            Intent i=new Intent(this,SecondActivity.class);
            i.putExtra("SPACECRAFTS",this.getData());
            startActivity(i);
        }
    }

结果

以下是你在运行该项目时得到的结果。

如何从ListView向ListView传递数据

下载

下载代码这里