可重复使用的观点?

时间:2017-11-11 13:03:47

标签: android android-fragments view bottomnavigationview

我是Android开发的新手,但我有很多Swing / WPF(C#)GUI体验。我想要做的是以下几点:

我有一个BottomNavigationView,包含3个不同的视图。每个视图都实现为通过OnNavigationItemSelectedListener在MainActivity java代码中显示/隐藏的片段:

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.one:
                findViewById(R.id.one).setVisibility(View.VISIBLE);
                findViewById(R.id.two).setVisibility(View.GONE);
                findViewById(R.id.threee).setVisibility(View.GONE);
                return true;
    // ... and so on

我的问题是两个片段的界面的一部分是相同的,由一组EditTextImageButton组成。所以我想创建一些可重用的东西,而不是加倍代码。我的选择是在片段中创建片段(但在互联网上我看到这是不可取的)或者创建一个可重复使用的视图(https://developer.android.com/training/improving-layouts/reusing-layouts.htmlhttps://developer.android.com/guide/topics/ui/custom-components.html)。最好的方法是什么?我想要一个带有连接的java代码的xml布局,在那里我可以听取与EditTextButtons的交互并相应地采取行动。也许我对我的WPF体验有偏见,但我试图让它像xaml + codebehind,这可能不是构建Android应用程序时解决问题的正确方法。

3 个答案:

答案 0 :(得分:2)

根据问题中的代码,您只是显示/隐藏布局中存在的视图 因此,首先我建议将 BottomNavigationView ViewPager 结合使用,并为每个导航项创建独立的碎片。
本文将演示如何开始使用 http://droidmentor.com/bottomnavigationview-with-viewpager-android/

其次,对于包含常见项目的所有片段,您将创建一个抽象的 BaseFragment 来管理所有常用逻辑。
扩展此抽象片段以创建单个片段并为独特布局充气。

<强> fragment_base.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--- Your Common Elements Here --->

    <!--- Unique Elements will get inserted here --->

</LinearLayout>

<强> fragment_nav_unique1.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--- Unique Elements For the Nav View Item --->

</LinearLayout>

<强> BaseFragment.java

public abstract class BaseFragment extends Fragment {

    // Get Layout resource id of the Individual Fragments
    protected abstract int layoutResourceId();

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // Inflate the base layout
        LinearLayout view = (LinearLayout) inflater.inflate(R.layout.fragment_base, container, false);

        // Inflate the unique layouts and add them to the view    
        LinearLayout uniqueView = (LinearLayout) inflater.inflate(layoutResourceId(), null);
        view.addView(uniqueView);

        // Return view
        return view;
    }

    //--- Manage all the Common Elements here ---

}

<强> FirstFragment.java

public class FirstFragment extends BaseFragment {
    @Override
    protected int layoutResourceId() {
        // Return the resource of the unique layout
        return R.layout.fragment_nav_unique1;
    }

    //--- Manage all the Unique Elements here ---

}

答案 1 :(得分:1)

您必须为不止一次使用的视图定义单独的XML布局

XML格式

您将在布局中使用<include>标记,如

 ...
<include layout="@layout/your_frequent_used_layout"/>

<TextView android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@string/hello"
          android:padding="10dp" />
....

更多信息here in the documentation training!

在Java中

对于Java方面如果您想获得某个视图并添加到当前布局,您将需要一个布局Inflater,然后在您的活动中添加到View这样的活动(在您的片段中考虑上下文如果它抛出任何错误

第一选项:

View view = null;
LayoutInflater inflater = 
(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.your_reusable_view, null);
your_main_root_view.addView(view);

第二选项:

View child = getLayoutInflater().inflate(R.layout.your_reusable_view, null);
your_main_root_view.addView(child);

答案 2 :(得分:0)

使用CustomView是实现此目的的方法。您不仅可以在此使用相同的布局文件,还可以在自定义视图实现中定义与此视图类似的交互。