隐藏工具栏上的元素,这些元素是在单个活动上,在各种片段上实现的

时间:2018-06-24 15:14:19

标签: java android android-fragments android-toolbar

我正试图从自定义工具栏中隐藏某些元素,这些元素已部署在MainActivity中(这是我应用中的唯一活动)。

因此,已实现了BotomNavigation,它处理了 3个片段,即Home,Records和Statistics

主要的 toolbar.xml 组成如下:

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

<android.support.v7.widget.Toolbar 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:elevation="4dp">

<TextView
    android:id="@+id/toolbarTitle"
    style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

<ImageView
    android:id="@+id/profileImage"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:src="@drawable/ic_account_circle_white_50dp"/>

您可以清楚地看到,它具有

  1. TextView ,可动态显示当前用户所在的片段名称并居中显示

  2. ImageView ,其中显示了经过身份验证的用户的图像,其中,如果用户没有个人资料图片,则src只是一个占位符。

使用以下 MainActivity.java 并非一切都能按预期方式进行:

public class MainActivity extends AppCompatActivity {

private TextView mTitle;
private String mUsername, mEmail;
private Uri mProfileImage;
private ImageView mProfileImageView;
private android.support.v7.widget.Toolbar mToolbar;
private static final String TAG = "BottomNavigation";

private BottomNavigationView.OnNavigationItemSelectedListener navListener;

public BottomNavigation() {

    navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment fragment;

            switch (item.getItemId()) {
                case R.id.nav_home:
                    mTitle.setText("Home");
            mToolbar.getMenu().findItem(R.id.profileImage).setVisible(false);
                    fragment = new HomeFragment();
                    loadFragment(fragment);
                    break;

                case R.id.nav_records:
                    mTitle.setText("Records");
            mToolbar.getMenu().findItem(R.id.profileImage).setVisible(false);
                    fragment = new RecordsFragment();
                    loadFragment(fragment);
                    break;

                case R.id.nav_stats:
                    mTitle.setText("Statistics");
                    fragment = new StatisticsFragment();
                    loadFragment(fragment);
                    Glide.with(getApplicationContext()).load(mProfileImage).into(mProfileImageView);
                    break;
            }

            return true;
        }
    };
}

}

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

    //replacing the default actionbar with custom toolbar
    mToolbar = findViewById(R.id.tool_bar);
    setSupportActionBar(mToolbar);
    mTitle = mToolbar.findViewById(R.id.toolbarTitle);
    //disabling the output of the appname on the toolbar
    getSupportActionBar().setDisplayShowTitleEnabled(false);


    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);


    //load the Home fragment by default

    loadFragment(new HomeFragment());
    mTitle.setText("Home");


    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
            mProfileImage = currentUser.getPhotoUrl();
    mProfileImageView = mToolbar.findViewById(R.id.profileImage);

}

private void loadFragment(Fragment fragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, fragment);
    transaction.commit();
}
}

我要实现的是隐藏“主页和记录”片段上的ImageView 统计信息。

为此,我在相应的case语句中使用了以下内容:

mToolbar.getMenu().findItem(R.id.profileImage).setVisible(false);

但是,由于某些原因,ImageView保持原样。有趣的是:

1。。占位符图像将继续保留,直到并且直到我移至“统计信息”片段并获取图像为止。

2。。获取后,即使从统计信息中移出图像,该图像仍将继续保留在工具栏中,

3。。如果我旋转到风景中,则所获取的图像将被删除,并且再次出现占位符。

我还尝试通过设置ImageView本身的可见性来隐藏可见性,但无济于事。

mProfileImageView.setVisibility(View.GONE);

实际上如何实现正确的逻辑,我应该在每个片段中都实现工具栏吗?这肯定不是健康的做法,并且违反了模块化片段的目的吗?

下面是一些屏幕截图,以便更好地理解:

ImageView not getting hidden, shows placeholder

Is visible even in the Records fragment

placeholder replaced with the user's image (fetched using FirebaseUI Auth)

rotating into landscape switches back to Home fragment and placeholder is replaced with the fetched image

as soon as I switch into statistics, imageview is replaced with the intended image

1 个答案:

答案 0 :(得分:0)

工具栏内的视图与我尝试更改其可见性的其他视图相同。

toolbar.findViewById(R.id.image).setVisibility(View.VISIBLE);

public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.findViewById(R.id.image).setVisibility(View.GONE);
        toolbar.postDelayed(new Runnable() {
            @Override
            public void run() {

  toolbar.findViewById(R.id.image).setVisibility(View.VISIBLE);
            }
        }, 5000);
    }
}

我的工具栏xml

<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_blue_light"
            android:contentInsetEnd="0dp"
            android:contentInsetLeft="0dp"
            android:contentInsetRight="0dp"
            android:contentInsetStart="0dp"
            app:contentInsetEnd="0dp"
            app:contentInsetLeft="0dp"
            app:contentInsetRight="0dp"
            app:contentInsetStart="0dp">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <ImageView
                    android:id="@+id/image"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:layout_marginRight="10dp"
                    android:src="@drawable/ic_launcher_foreground" />

                <TextView
                    android:id="@+id/appTitle"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_centerInParent="true"
                    android:gravity="center"
                    android:text="Title"
                    android:textColor="@android:color/background_dark"
                    android:textSize="20sp" />


            </RelativeLayout>

        </android.support.v7.widget.Toolbar>