Android's Fragment Intensive - Implementation of the Bottom Navigation Bar (Method 1)

Introduction to this section:

In the previous section, we had a preliminary understanding of Fragment, learned the concept, life cycle, Fragment management and Fragment affairs, and dynamically and statically loaded Fragment. Starting from this section, we will explain some examples of Fragment in actual development! And this section will explain to you the realization of the bottom navigation bar! There are many methods for the basic bottom navigation bar, such as using TextView, or using RadioButton, or using TabLayout + RadioButton. Of course, in complex situations, you still have to use the outer layer layout method! In this section, we use TextView to make the effect of a bottom navigation bar, and we are also familiar with the use of Fragment! Ok, on to this section!


1. The effect diagram to be realized and the project directory structure:

Let's take a look at the renderings first:

Then look at the directory structure of our project :


2. Implementation process:


Step 1: Write down some resource files for the bottom options

We can see from the picture that every item at the bottom of us has a different effect when clicked, right? We judge by whether it is selected! The resource files we want to write are: first is the picture, then the text, and then the background!

Image Drawable resource: tab_menu_channel.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/tab_channel_pressed" android:state_selected="true" />
    <item android:drawable="@mipmap/tab_channel_normal" />
</selector>

The other three followed suit!

Text resource: tab_menu_text.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/text_yellow" android:state_selected="true" />
    <item android:color="@color/text_gray" />
</selector>

Background resource: tab_menu_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <shape>
            <solid android:color="#FFC4C4C4" />
        </shape>
    </item>
    <item>
        <shape>
            <solid android:color="@color/transparent" />
        </shape>
    </item>
</selector>

Step 2: Write our Activity layout

activity_main.xml:

<RelativeLayout 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=".MainActivity">

    <RelativeLayout
        android:id="@+id/ly_top_bar"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@color/bg_topbar">

        <TextView
            android:id="@+id/txt_topbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:textSize="18sp"
            android:textColor="@color/text_topbar"
            android:text="信息"/>


        <View
            android:layout_width="match_parent"
            android:layout_height="2px"
            android:background="@color/div_white"
            android:layout_alignParentBottom="true"/>

    </RelativeLayout>



    <LinearLayout
        android:id="@+id/ly_tab_bar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"
        android:background="@color/bg_white"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/txt_channel"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_channel"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_alert"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_message"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_message"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_profile"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_better"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_better"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_pay"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/txt_setting"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/tab_menu_bg"
            android:drawablePadding="3dp"
            android:drawableTop="@drawable/tab_menu_setting"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/tab_menu_setting"
            android:textColor="@drawable/tab_menu_text"
            android:textSize="16sp"/>

    </LinearLayout>

    <View
        android:id="@+id/div_tab_bar"
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/div_white"
        android:layout_above="@id/ly_tab_bar"/>


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/ly_top_bar"
        android:layout_above="@id/div_tab_bar"
        android:id="@+id/ly_content">

    </FrameLayout>

</RelativeLayout>

Code analysis:

First define the style of the top title bar, add a TextView in the middle of the 48dp LinearLayout as the title!
Then define a LinerLayout with a size of 56dp to its bottom, add four TextViews in it, with a ratio of 1:1:1:1, and set related properties, and then add a line segment to this LinearLayout!
Finally, with the title bar and the bottom navigation bar as the border, write a FrameLayout, width and height match_parent, and use it as a Fragment container!

PS: The four TextView properties here are repeated, you can also extract them yourself, write a style, and set it~


Step 3: Hide the top navigation bar

Accidentally found that the previous call requestWindowFeature(Window.FEATURE_NO_TITLE) in the Activity ; can hide the top navigation bar of the mobile phone, but when writing the demo, I found that an error will be reported, even if this sentence is written before setContentView()! It may be because the AppCompatActivity is inherited instead of the Activity class!
Of course, the previous getSupportActionbar().hide() hides the Actionbar, but it will still be on the interface! Finally, there is another way to write a style yourself, and then set the Theme for Application in AndroidManifest.xml:

Note:  Put requestWindowFeature(Window.FEATURE_NO_TITLE); in front of super.onCreate(savedInstanceState); to hide ActionBar without reporting an error.

Then set the theme attribute in AndroidManifest.xml :

android:theme="@style/Theme.AppCompat.NoActionBar"

PS: The above "code of conscience" is sponsored by good programmer Cao Shen~


Step 4: Create a simple layout and class of Fragment:

fg_content.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg_white">
    
    <TextView
        android:id="@+id/txt_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="呵呵"
        android:textColor="@color/text_yellow"
        android:textSize="20sp"/>

</LinearLayout>

MyFragment.java:

/**
 * Created by Coder-pig on 2015/8/28 0028.
 */
public class MyFragment extends Fragment {

    private String content;
    public MyFragment(String content) {
        this.content = content;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fg_content,container,false);
        TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
        txt_content.setText(content);
        return view;
    }
}

Code analysis:

It simply rewrites an onCreateView() method, and other methods can be rewritten as needed!


Step 5: Write MainActivity.java

Let's start with some of the key questions we need to consider:

  • When is Fragment initialized and added to the container? When to hide and show?
  • How to make TextView be selected? What to do after selecting a TextView?
  • How to make a TextView in the Selected state just after entering MainActivity?

Well, let's answer the above questions one by one:

  • After we select the TextView, we judge the corresponding Fragment to be empty. If it is empty, initialize it and add it to the container; for hide, we define a method to hide all Fragments, and call the hideAll method every time a click event is triggered. All Fragments are hidden, and if the Fragment corresponding to TextView is not empty, we will display this Fragment;
  • We achieve this through the click event. After clicking the TextView, first reset the selected state of all TextViews to false, and then set the selected state of the clicked TextView to true;
  • This is simpler, we set the selection through the click event, so it is enough to add a method to trigger the click event in the onCreate() method~  txt_channel.performClick();

Now that the logic is understood, let’s go directly to the code:

MainActivity.java:

/**
 * Created by Coder-pig on 2015/8/28 0028.
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //UI Object
    private TextView txt_topbar;
    private TextView txt_channel;
    private TextView txt_message;
    private TextView txt_better;
    private TextView txt_setting;
    private FrameLayout ly_content;

    //Fragment Object
    private MyFragment fg1,fg2,fg3,fg4;
    private FragmentManager fManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main); 
        fManager = getFragmentManager(); 
        bindViews(); 
        txt_channel.performClick(); //Simulate a click, select the first item after entering 
    } 

    //UI component initialization and event binding 
    private void bindViews() { 
        txt_topbar = (TextView) findViewById(R.id.txt_topbar); 
        txt_channel = (TextView) findViewById(R.id.txt_channel); 
        txt_message = (TextView) findViewById(R.id.txt_message); 
        txt_better = (TextView ) findViewById(R.id.txt_better); 
        txt_setting = (TextView) findViewById(R.id.txt_setting); 
        ly_content = (FrameLayout) findViewById(R.id.ly_content); 

        txt_channel.setOnClickListener(this);
        txt_message.setOnClickListener(this);
        txt_better.setOnClickListener(this);
        txt_setting.setOnClickListener(this);
    }

    //重置所有文本的选中状态
    private void setSelected(){
        txt_channel.setSelected(false);
        txt_message.setSelected(false);
        txt_better.setSelected(false);
        txt_setting.setSelected(false);
    }

    //隐藏所有Fragment
    private void hideAllFragment(FragmentTransaction fragmentTransaction){
        if(fg1 != null)fragmentTransaction.hide(fg1);
        if(fg2 != null)fragmentTransaction.hide(fg2);
        if(fg3 != null)fragmentTransaction.hide(fg3);
        if(fg4 != null)fragmentTransaction.hide(fg4);
    }


    @Override
    public void onClick(View v) {
        FragmentTransaction fTransaction = fManager.beginTransaction();
        hideAllFragment(fTransaction);
        switch (v.getId()){
            case R.id.txt_channel:
                setSelected();
                txt_channel.setSelected(true);
                if(fg1 == null){
                    fg1 = new MyFragment("第一个Fragment");
                    fTransaction.add(R.id.ly_content,fg1);
                }else{
                    fTransaction.show(fg1);
                }
                break;
            case R.id.txt_message:
                setSelected();
                txt_message.setSelected(true);
                if(fg2 == null){
                    fg2 = new MyFragment("第二个Fragment");
                    fTransaction.add(R.id.ly_content,fg2);
                }else{
                    fTransaction.show(fg2);
                }
                break;
            case R.id.txt_better:
                setSelected();
                txt_better.setSelected(true);
                if(fg3 == null){
                    fg3 = new MyFragment("第三个Fragment");
                    fTransaction.add(R.id.ly_content,fg3);
                }else{
                    fTransaction.show(fg3);
                }
                break;
            case R.id.txt_setting:
                setSelected();
                txt_setting.setSelected(true);
                if(fg4 == null){
                    fg4 = new MyFragment("第四个Fragment");
                    fTransaction.add(R.id.ly_content,fg4);
                }else{
                    fTransaction.show(fg4);
                }
                break;
        }
        fTransaction.commit();
    }
}

Guess you like

Origin blog.csdn.net/leyang0910/article/details/131449537