如何在底部导航按钮点击时更改活动?

20

我想在现有的Android应用程序中使用底部导航栏,但问题是所有屏幕都是Activity,是否可能加载Activity时不隐藏底部导航栏。

示例: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/myScrollingContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Your loooooong scrolling content here. -->

    </android.support.v4.widget.NestedScrollView>
    <com.roughike.bottombar.BottomBar
        android:id="@+id/bottomBar"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_gravity="bottom"
        app:bb_tabXmlResource="@xml/bottom_bar"
        app:bb_behavior="shy"/>

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

这是我的基础活动:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        BottomBar bottomBar;
        bottomBar = (BottomBar) findViewById(R.id.bottomBar);
        bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
            @Override
            public void onTabSelected(@IdRes int tabId) {
                if (tabId == R.id.matching) {
                    Log.i("matching","matching inside "+tabId);
                    Intent in=new Intent(getBaseContext(),Main2Activity.class);
                    startActivity(in);
                }else if (tabId == R.id.watchlist) {
                    Log.i("matching","watchlist inside "+tabId);
                    Intent in=new Intent(getBaseContext(),Main3Activity.class);
                    startActivity(in);
                }
            }
        });
    }
}

Main2Activity

public class Main2Activity extends MainActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main2);
        NestedScrollView dynamicContent = (NestedScrollView) findViewById(R.id.myScrollingContent);
        View wizard = getLayoutInflater().inflate(R.layout.activity_main2, null);
        dynamicContent.addView(wizard);

Main3Activity

public class Main3Activity extends MainActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main3);
        NestedScrollView dynamicContent = (NestedScrollView) findViewById(R.id.myScrollingContent);
        View wizard = getLayoutInflater().inflate(R.layout.activity_main3, null);
        dynamicContent.addView(wizard);


    }
}

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bottom.bottomnavigation">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".Main2Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity" />
        <activity android:name=".Main3Activity"></activity>
    </application>

</manifest>

你能提供截图吗? - Truong Hieu
除了你的问题,Main3Activity甚至不应该工作,因为如果没有内容视图,findViewById无法找到视图。 - OneCricketeer
2个回答

18
我用如下方法解决了这个问题:
1.创建一个带有底部导航栏的“BaseActivity”。
 package com.example.apple.bottomnavbarwithactivity;

 import android.content.Intent;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.util.Log;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;

public class BaseActivity extends AppCompatActivity {


RadioGroup radioGroup1;
RadioButton deals;

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


    radioGroup1=(RadioGroup)findViewById(R.id.radioGroup1);
    deals = (RadioButton)findViewById(R.id.deals);
    radioGroup1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId)
        {
            Intent in;
            Log.i("matching", "matching inside1 bro" + checkedId);
            switch (checkedId)
            {
                case R.id.matching:
                    Log.i("matching", "matching inside1 matching" +  checkedId);
                    in=new Intent(getBaseContext(),MatchingActivity.class);
                    startActivity(in);
                    overridePendingTransition(0, 0);
                    break;
                case R.id.watchList:
                    Log.i("matching", "matching inside1 watchlistAdapter" + checkedId);

                    in = new Intent(getBaseContext(), WatchlistActivity.class);
                    startActivity(in);
                    overridePendingTransition(0, 0);

                    break;
                case R.id.rates:
                    Log.i("matching", "matching inside1 rate" + checkedId);

                    in = new Intent(getBaseContext(),RatesActivity.class);
                    startActivity(in);
                    overridePendingTransition(0, 0);
                    break;
                case R.id.listing:
                    Log.i("matching", "matching inside1 listing" + checkedId);
                    in = new Intent(getBaseContext(), ListingActivity.class);
                    startActivity(in);
                    overridePendingTransition(0, 0);
                    break;
                case R.id.deals:
                    Log.i("matching", "matching inside1 deals" + checkedId);
                    in = new Intent(getBaseContext(), DealsActivity.class);
                    startActivity(in);
                    overridePendingTransition(0, 0);
                    break;
                default:
                    break;
            }
        }
    });
   }
 }

基础活动布局名为base_activity.xml

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:elevation="10dp"
        android:background="@color/white"
        android:id="@+id/bottonNavBar"
        android:paddingTop="5dp"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        android:foregroundGravity="bottom">


        <RadioGroup
            android:id="@+id/radioGroup1"
            android:gravity="center"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:baselineAligned="false">

            <RadioButton
                android:layout_width="match_parent"
                android:gravity="center"
                android:layout_height="match_parent"
                android:text="Matching"
                android:layout_weight="1"
                android:button="@null"
                android:padding="2dp"
                android:checked="false"
                android:textSize="12sp"
                android:drawableTop="@drawable/selector_matching"
                android:textColor="@drawable/selector_nav_text"
                android:id="@+id/matching"/>

            <RadioButton
                android:layout_width="match_parent"
                android:gravity="center"
                android:layout_height="match_parent"
                android:button="@null"
                android:layout_weight="1"
                android:padding="2dp"
                android:checked="false"
                android:textSize="12sp"
                android:drawableTop="@drawable/selector_watchlist"
                android:textColor="@drawable/selector_nav_text"
                android:id="@+id/watchList"
                android:text="Watchlist"/>

            <RadioButton
                android:layout_width="match_parent"
                android:gravity="center"
                android:layout_height="match_parent"
                android:id="@+id/rates"
                android:button="@null"
                android:paddingTop="5dp"
                android:paddingBottom="2dp"
                android:paddingLeft="2dp"
                android:paddingRight="2dp"
                android:layout_weight="1"
                android:checked="false"
                android:textSize="12sp"
                android:drawableTop="@drawable/selector_rates"
                android:textColor="@drawable/selector_nav_text"
                android:text="Rates"/>
            <RadioButton
                android:layout_width="match_parent"
                android:gravity="center"
                android:layout_height="match_parent"
                android:button="@null"
                android:padding="2dp"
                android:checked="false"
                android:layout_weight="1"
                android:textSize="12sp"
                android:drawableTop="@drawable/selector_deals"
                android:textColor="@drawable/selector_nav_text"
                android:id="@+id/deals"
                android:text="Deals"/>
            <RadioButton
                android:layout_width="match_parent"
                android:gravity="center"
                android:layout_height="match_parent"
                android:button="@null"
                android:padding="2dp"
                android:checked="false"
                android:layout_weight="1"
                android:textSize="12sp"
                android:drawableTop="@drawable/selector_listing"
                android:textColor="@drawable/selector_nav_text"
                android:id="@+id/listing"
                android:text="Listing"/>


        </RadioGroup>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/dynamicContent"
        android:orientation="vertical"
        android:layout_marginBottom="56dp"
        android:background="@color/white"
        android:layout_gravity="bottom">
    </LinearLayout>

在想要在底部导航栏点击时打开的所有活动中扩展BaseActivity,并需要填充活动布局。 例如,我创建了五个示例活动。

i] MatchingActivity.

  package com.example.apple.bottomnavbarwithactivity;

    import android.graphics.Color;
    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.widget.LinearLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
              //extends our custom BaseActivity
    public class MatchingActivity extends BaseActivity {
        LinearLayout dynamicContent,bottonNavBar;

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


                       //dynamically include the  current activity      layout into  baseActivity layout.now all the view of baseactivity is   accessible in current activity.
            dynamicContent = (LinearLayout)  findViewById(R.id.dynamicContent);
            bottonNavBar= (LinearLayout) findViewById(R.id.bottonNavBar);
            View wizard = getLayoutInflater().inflate(R.layout.activity_matching, null);
            dynamicContent.addView(wizard);


              //get the reference of RadioGroup.

            RadioGroup rg=(RadioGroup)findViewById(R.id.radioGroup1);
            RadioButton rb=(RadioButton)findViewById(R.id.matching);

                 // Change the corresponding icon and text color on nav button click.

            rb.setCompoundDrawablesWithIntrinsicBounds( 0,R.drawable.ic_matching_clicked, 0,0);
            rb.setTextColor(Color.parseColor("#3F51B5"));
        }

    }

ii]关注列表活动

 package com.example.apple.bottomnavbarwithactivity;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;

    public class WatchlistActivity extends AppCompatActivity {
        LinearLayout dynamicContent,bottonNavBar;

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

            dynamicContent = (LinearLayout) findViewById(R.id.dynamicContent);
            bottonNavBar= (LinearLayout) findViewById(R.id.bottonNavBar);
            View wizard = getLayoutInflater().inflate(R.layout.activity_watchlist1, null);
            dynamicContent.addView(wizard);

            RadioGroup rg=(RadioGroup)findViewById(R.id.radioGroup1);
            RadioButton rb=(RadioButton)findViewById(R.id.watchList);
            rb.setCompoundDrawablesWithIntrinsicBounds( 0,R.drawable.favourite_heart_selected, 0,0);
            rb.setTextColor(Color.parseColor("#3F51B5"));
        }
    }

iii]RatesActivity

  package com.example.apple.bottomnavbarwithactivity;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;

    public class RatesActivity extends BaseActivity {
        LinearLayout dynamicContent,bottonNavBar;

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

            dynamicContent = (LinearLayout) findViewById(R.id.dynamicContent);
            bottonNavBar= (LinearLayout) findViewById(R.id.bottonNavBar);
            View wizard = getLayoutInflater().inflate(R.layout.activity_rates, null);
            dynamicContent.addView(wizard);

            RadioGroup rg=(RadioGroup)findViewById(R.id.radioGroup1);
            RadioButton rb=(RadioButton)findViewById(R.id.rates);
            rb.setCompoundDrawablesWithIntrinsicBounds( 0,R.drawable.ic_rate_clicked, 0,0);
            rb.setTextColor(Color.parseColor("#3F51B5"));
        }
    }

iv] ListingActivity

 package com.example.apple.bottomnavbarwithactivity;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;

    public class ListingActivity extends BaseActivity {
        LinearLayout dynamicContent,bottonNavBar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
             //setContentView(R.layout.activity_listing);



            dynamicContent = (LinearLayout) findViewById(R.id.dynamicContent);
            bottonNavBar= (LinearLayout) findViewById(R.id.bottonNavBar);
            View wizard = getLayoutInflater().inflate(R.layout.activity_listing, null);
            dynamicContent.addView(wizard);

            RadioGroup rg=(RadioGroup)findViewById(R.id.radioGroup1);
            RadioButton rb=(RadioButton)findViewById(R.id.listing);
            rb.setCompoundDrawablesWithIntrinsicBounds( 0,R.drawable.ic_listing_clicked, 0,0);
            rb.setTextColor(Color.parseColor("#3F51B5"));
        }
    }

v] DealsActivity

 package com.example.apple.bottomnavbarwithactivity;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;

    public class DealsActivity extends BaseActivity {

        LinearLayout dynamicContent,bottonNavBar;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_deals);
            dynamicContent = (LinearLayout) findViewById(R.id.dynamicContent);
            bottonNavBar= (LinearLayout) findViewById(R.id.bottonNavBar);
            View wizard = getLayoutInflater().inflate(R.layout.activity_deals, null);
            dynamicContent.addView(wizard);

            RadioGroup rg=(RadioGroup)findViewById(R.id.radioGroup1);
            RadioButton rb=(RadioButton)findViewById(R.id.deals);
            rb.setCompoundDrawablesWithIntrinsicBounds( 0,R.drawable.ic_deals_clicked, 0,0);
            rb.setTextColor(Color.parseColor("#3F51B5"));



        }
    }

注意:确保您正确地处理后退操作。我没有编写任何后退操作的代码。

这里输入图片描述

这里输入图片描述

这里输入图片描述

这里输入图片描述

这里输入图片描述


1
我正在实现这段代码,但我不明白如何避免活动被重新创建?我的意思是,我失去了活动状态,它会从头开始重新创建。 - Giuseppe Capoluongo
{btsdaf} - Sushil Dubey

5

使用 Activity,每次加载该 activity 时都需要声明和初始化 BottomBar

对于您的问题,我的回答是

顺便说一句,您可以使用Fragment来很好地解决这个问题。

是时候学些新东西了,伙计。

编辑

Fragment 放在仅有的 1Activity 中,并将 BottomBar 放在 Activity 中,而所有其他视图和数据集则放在 Fragment 中。

试试看吧!


我的应用程序有五个主屏幕,全部都是活动。现在将这些活动更改为片段非常困难且耗时,是否有任何方法可以在现有的活动中实现底部导航视图? - Sushil Dubey
3
你研究过“Fragment”吗?我认为只有5个屏幕,它不会太难也不需要太多工作 :D。无论是“Activity”还是“Fragment”,它们之间的差别并不大。 你应该考虑后期的维护需求,做出一些更改。 - Truong Hieu
1
设置活动怎么样?我可以把它放在底部导航栏吗? - Anton Makov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接