2017年4月7号作业,Fragment之间的切换。
首先,分析一下作业要求:在程序开始运行的时候就要将第一个Fragment加载出来,然后点击“SHOW NEXT PAGE”就要切换到第二个Fragment,当再次点击按钮时下方出现提示“This is second fragment”,再点击屏幕上的返回键,切换至第一个Fragment。整个作业要求就这么多,但是这其中有一个小的问题,那就是在点击返回键时会切换Fragment,那么怎才能够在第一个Fragment时点击返回键就执行程序的退出。这是这次作业我碰到的一个小问题。问题的解决方法下面我会再具体的说一下,现在先看一下整体的代码:
主界面的布局代码以及效果图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.a15083.fragmentandactivity.FragmentActivity"><LinearLayoutandroid:id="@+id/show"android:layout_width="match_parent"android:layout_height="0dp"android:orientation="vertical"android:layout_weight="1"></LinearLayout><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"><Buttonandroid:id="@+id/bt_show"android:layout_width="250dp"android:layout_height="wrap_content"android:text="@string/bt_show"android:layout_gravity="center_horizontal"android:gravity="center"android:onClick="onClick"/></LinearLayout></LinearLayout>
第一个Fragment的布局代码以及效果图:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.a15083.fragmentandactivity.FirstFragment"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/holo_blue_light"android:gravity="center"android:textSize="25sp"android:text="@string/first_fragment" /></FrameLayout>
第二个Fragment的布局代码以及效果图:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.a15083.fragmentandactivity.SecondFragment"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/colorAccent"android:gravity="center"android:text="@string/second_fragment"android:textSize="25sp" /></FrameLayout>
因为在两个Fragment对应的Activity文件里任何代码都没有写,所以就不将那些代码贴出来了,直接贴出主界面功能实现的代码:
package com.example.a15083.fragmentandactivity;import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;public class FragmentActivity extends AppCompatActivity implements View.OnClickListener{FirstFragment firstFragment;SecondFragment secondFragment;private boolean a=true; //a的作用就是来判断第二次点击按钮时是否切换fragmentboolean e=false; //e的作用是用来在第一个fragment点击返回时就执行退出程序操作@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fragment);FragmentManager manager = getFragmentManager();FragmentTransaction transaction = manager.beginTransaction();firstFragment = new FirstFragment();transaction.add(R.id.show,firstFragment);transaction.commit();}@Overridepublic void onClick(View view) {if(view.getId()==R.id.bt_show){e=true; //将e的值设置为true,使在点击返回键时能够切换fragmentif(a){FragmentManager manager = getFragmentManager();FragmentTransaction transaction = manager.beginTransaction();if (secondFragment == null){secondFragment = new SecondFragment();transaction.replace(R.id.show,secondFragment);transaction.commit();a=false; //设置a为false,使在第二次以后点击按钮能够弹出提示} else{transaction.replace(R.id.show,secondFragment);transaction.commit();a=false; //设置a为false,使在第二次以后点击按钮能够弹出提示}}else{Toast.makeText(this,"This is second fragment",Toast.LENGTH_SHORT).show();}}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if(event.getKeyCode()==KeyEvent.KEYCODE_BACK&&e){FragmentManager manager = getFragmentManager();FragmentTransaction transaction = manager.beginTransaction();a=true; //设置a为true,以便是点击按钮时能再次切换fragmente=false; //设置e为false,使在第一个fragment时能够退出transaction.replace(R.id.show,firstFragment);transaction.commit();return false;} else {finish();}return super.onKeyDown(keyCode, event);}
}
说一下上面提到的问题我是怎么解决的。首先声明了一个全局变量“e”并设置为false,当界面上显示的是第一个Fragment的时候,这时候点击返回键会进行一次判断"e"的值是否"true",如果不是程序直接退出。当切换到第二个Fragment的时候,我直接将“e”的值设置为"true"这样在第二个界面点击返回键时,程序不会退出而是切换回到第一个Fragment,并且此时点击返回键时“e”的值变成"false",这样在点击返回键的时候程序就会直接退出。整个的解决思路就是这样,代码中也已经实现了。下面附上程序运行的效果图。