Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 打开活动而不消失底部栏_Android - Fatal编程技术网

Android 打开活动而不消失底部栏

Android 打开活动而不消失底部栏,android,Android,根据新的底部栏解决方案,我找不到实现以下目标的想法: 我知道点击图片后,新的活动就要开始了,但如何才能在不消失底部栏的情况下打开它呢 编辑 我所说的例子是,在“音乐”选项卡中,用户单击Kodaline相册时,它会显示一些类似于新活动的内容。新活动未启动,否则底部导航栏会在一瞬间消失。基本思想是让一个活动根据选择的项目将视图或片段膨胀到容器中。我建议使用视图而不是片段,因为某些FragmentTransaction bug特别难以追踪,而且当您完全可以控制定义自定义视图时,您将任由Fragmen

根据新的底部栏解决方案,我找不到实现以下目标的想法:

我知道点击图片后,新的活动就要开始了,但如何才能在不消失底部栏的情况下打开它呢

编辑


我所说的例子是,在“音乐”选项卡中,用户单击Kodaline相册时,它会显示一些类似于新活动的内容。

新活动未启动,否则底部导航栏会在一瞬间消失。基本思想是让一个活动根据选择的项目将视图或片段膨胀到容器中。我建议使用视图而不是片段,因为某些FragmentTransaction bug特别难以追踪,而且当您完全可以控制定义自定义视图时,您将任由FragmentManager摆布。示例gif将底部导航的可见性设置为View.GONE,并在滚动期间设置底部导航的动画

MainActivity.java

public class MainActivity extends Activity implements
YourBottomNavView.OnItemClickListener {

    ViewGroup viewContainer;
    YourBottomNavView bottomNav;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewContainer = findViewById(R.id.view_container);
        bottomNav = findViewById(R.id.bottom_nav);
        bottomNav.setItemClickListener(this);
    }

    @Override
    public void onItemClicked(int item) {
        viewContainer.removeAllViews();
        View nextView = getView(item);
        viewContainer.addView(nextView);
    }

    private View getView(int item) {
        //Insert logic
    }
}
public class YourBottomNavView extends LinearLayout {
    View button1, button2, button3;
    View root;
    OnItemClickListener onItemClickListener;

    public YourBottomNavView(Context context) {
        super(context);
        init();
    }

    public YourBottomNavView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        inflate(getContext(), R.layout.view_bottom_nav, this);
        root = findViewById(R.id.root);
        button1 = findViewById(R.id.button1_container);
        button2 = findViewById(R.id.button2_container);
        button3 = findViewById(R.id.button3_container);

        //The button clicks need to communicate to something like the
        //activity to inflate your new view / fragment. I personally
        //define an OnItemClickedListener interface in the 
        //YourBottomNavView class that the MainActivity implements
        //and I have the activity decide which view to inflate into
        //its frame layout. This is also where you can do cool
        //animations like we saw from the GIFs.
        //This is also where you can swap out drawables to color the  
        //ImageViews differently.

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClicked(0);
                root.setBackgroundColor(0xFF0000);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClicked(1);
                root.setBackgroundColor(0x00FF00);
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
                onItemClickListener.onItemClicked(2);
                root.setBackgroundColor(0x0000FF);
            }
        });
    }

    public void setItemClickListener(OnItemClickListener listener) {
        onItemClickListener = listener;
    }

    public interface OnItemClickListener {
        void onItemClicked(int item);
    }
}
R.layout.activity\u main

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

    <FrameLayout
        android:id="@+id/view_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/header"/>

    <YourBottomNavView
        android:id="@+id/bottom_nav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"/>
</RelativeLayout>
YourBottomNavView.java

public class MainActivity extends Activity implements
YourBottomNavView.OnItemClickListener {

    ViewGroup viewContainer;
    YourBottomNavView bottomNav;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewContainer = findViewById(R.id.view_container);
        bottomNav = findViewById(R.id.bottom_nav);
        bottomNav.setItemClickListener(this);
    }

    @Override
    public void onItemClicked(int item) {
        viewContainer.removeAllViews();
        View nextView = getView(item);
        viewContainer.addView(nextView);
    }

    private View getView(int item) {
        //Insert logic
    }
}
public class YourBottomNavView extends LinearLayout {
    View button1, button2, button3;
    View root;
    OnItemClickListener onItemClickListener;

    public YourBottomNavView(Context context) {
        super(context);
        init();
    }

    public YourBottomNavView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        inflate(getContext(), R.layout.view_bottom_nav, this);
        root = findViewById(R.id.root);
        button1 = findViewById(R.id.button1_container);
        button2 = findViewById(R.id.button2_container);
        button3 = findViewById(R.id.button3_container);

        //The button clicks need to communicate to something like the
        //activity to inflate your new view / fragment. I personally
        //define an OnItemClickedListener interface in the 
        //YourBottomNavView class that the MainActivity implements
        //and I have the activity decide which view to inflate into
        //its frame layout. This is also where you can do cool
        //animations like we saw from the GIFs.
        //This is also where you can swap out drawables to color the  
        //ImageViews differently.

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClicked(0);
                root.setBackgroundColor(0xFF0000);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClicked(1);
                root.setBackgroundColor(0x00FF00);
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
                onItemClickListener.onItemClicked(2);
                root.setBackgroundColor(0x0000FF);
            }
        });
    }

    public void setItemClickListener(OnItemClickListener listener) {
        onItemClickListener = listener;
    }

    public interface OnItemClickListener {
        void onItemClicked(int item);
    }
}
R.布局。查看底部导航

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:background="@color/default_color"
    android:orientation="horizontal">

    <LinearLayout
        android:id="@+id/button1_container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weight="1">

        <ImageView android:id="@+id/image1"
            android:layout_width="24dp"
            android:layout_height="24dp"
            src="@drawable/icon1"/>

        <TextView
            android:id="@+id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/button2_container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weight="1">

        <ImageView android:id="@+id/image2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            src="@drawable/icon1"/>

        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/button3_container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weight="1">

        <ImageView android:id="@+id/button3"
            android:layout_width="24dp"
            android:layout_height="24dp"
            src="@drawable/icon3"/>

        <TextView
            android:id="@+id/text3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

在考虑我的应用程序的这个问题几个月后。 我发现,仅使用Android应用程序中使用的MVC模式很难实现所需的行为,因为沿着应用程序流将主要活动保持在屏幕上会使这个类过载

尽管谷歌Android教程传播了MVC的理念,但真正的谷歌应用程序和设计示例(就像你说的这个漂亮的音乐播放器)在架构和代码组织方面都遥遥领先


这个问题的真正解决方案是使用MVC以外的另一种模式来解耦逻辑和视图。您可能希望阅读中使用的模式,以便将繁重的代码在多个类中解耦,并在屏幕上保持相同的活动(带底部栏的活动)。

我认为使用片段代替活动,并在父活动布局上保持“底部栏”。应该给你线索。IMO提出的第一个解决方案很糟糕,因为代码变得混乱。我宁愿选择选项2,使用某种主机活动来保存navBarView并在其中更改片段,这样更简单、更干净、更灵活。但是状态栏的颜色怎么可能会改变呢?它应该需要重新加载活动或创建新的活动。我以前使用过片段,如果您对它们更满意,则可以使用类似的解决方案,将片段充气到FrameLayout中。然而,正如我所说的,我遇到了一些无法调试的事务错误。对于底部导航的onClickListeners,您必须自己管理状态。因此,当你点击一个按钮时,你需要确保其他按钮被设置为“未选中”,而你点击的按钮被设置为“选中”,并相应地改变颜色。你不明白。我说的是一个例子,在音乐标签中,用户点击Kodaline相册,然后它会显示一些新的活动。这不是一个新的活动。如果这是一个新的活动,整个屏幕将不得不重新绘制,底部导航将消失一秒钟。当用户轻触Kodaline相册时,一个新视图将被设置动画并充气到容器中。我在谷歌有一个朋友,他喜欢简单的旧视图而不是片段。我只是想告诉你们,要实现这一点,你们需要将一个视图或片段充气到一个容器中。