Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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
Java 使用基本片段的视图/布局_Java_Android_Inheritance_Android Fragments - Fatal编程技术网

Java 使用基本片段的视图/布局

Java 使用基本片段的视图/布局,java,android,inheritance,android-fragments,Java,Android,Inheritance,Android Fragments,我有一个带有FrameLayout的基本片段,我想在派生片段中使用此布局,并向其添加一个onTouchListener BaseFragment.java public class BaseFragment extends Fragment { protected FrameLayout baseFrameLayout; protected View baseView; @Override public View onCreateView(LayoutInfl

我有一个带有FrameLayout的基本片段,我想在派生片段中使用此布局,并向其添加一个onTouchListener

BaseFragment.java

public class BaseFragment extends Fragment {

    protected FrameLayout baseFrameLayout;
    protected View baseView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);

        baseView = inflater.inflate(R.layout.fragment_base, container, false);

        baseFrameLayout = (FrameLayout) baseView.findViewById(R.id.frameLayout);

        return baseView;
    }
}
public class DerivedFragment extends BaseFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);

        baseFrameLayout.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                // do something
                return true;
            }
        });

        return baseView;
    }
}
public class OverViewFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_overView, container, false);

        Fragment derivedFragment = new DerivedFragment();
        FragmentTransaction devTrans = getChildFragmentManager().beginTransaction();
        devTrans.add(R.id.derivedFragmentId, derivedFragment).commit();

        Fragment footerFragment = new FooterFragment();
        FragmentTransaction statTrans = getChildFragmentManager().beginTransaction();
        statTrans.add(R.id.footerFragmentId, footerFragment).commit();

        return view;
    }
}
fragment_base.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frameLayout"
    android:clickable="true" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
    android:id="@+id/derivedFragmentId"
    android:layout_above="@+id/footerFragmentId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_centerVertical="true"
    android:gravity="center" 
    />

<FrameLayout
    android:id="@+id/footerFragmentId"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

</RelativeLayout>
不幸的是,当我触摸FrameLayout时,onTouchListener没有执行


编辑:

最后,我以这种方式将DerivedFragment添加到另一个片段中:

OverViewFragment.java

public class BaseFragment extends Fragment {

    protected FrameLayout baseFrameLayout;
    protected View baseView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);

        baseView = inflater.inflate(R.layout.fragment_base, container, false);

        baseFrameLayout = (FrameLayout) baseView.findViewById(R.id.frameLayout);

        return baseView;
    }
}
public class DerivedFragment extends BaseFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);

        baseFrameLayout.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                // do something
                return true;
            }
        });

        return baseView;
    }
}
public class OverViewFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_overView, container, false);

        Fragment derivedFragment = new DerivedFragment();
        FragmentTransaction devTrans = getChildFragmentManager().beginTransaction();
        devTrans.add(R.id.derivedFragmentId, derivedFragment).commit();

        Fragment footerFragment = new FooterFragment();
        FragmentTransaction statTrans = getChildFragmentManager().beginTransaction();
        statTrans.add(R.id.footerFragmentId, footerFragment).commit();

        return view;
    }
}
fragment\u overView.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frameLayout"
    android:clickable="true" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
    android:id="@+id/derivedFragmentId"
    android:layout_above="@+id/footerFragmentId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_centerVertical="true"
    android:gravity="center" 
    />

<FrameLayout
    android:id="@+id/footerFragmentId"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

</RelativeLayout>

我以前从未使用过空布局。所以我只是测试了一下

使用以下行时,布局不可见,也不会单击:

<FrameLayout
    android:id="@+id/frameLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

以下几行可以工作:

<FrameLayout
    android:id="@+id/frameLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />


因此,要么让布局
与父视图匹配,要么在内部添加视图

@OberLansch无效,但我已将其添加到我的问题中:(FrameLayout上方是否有其他视图?@OberLansch我已编辑我的问题,我不知道……抱歉。只是一些提示:android:layout_over=“@+id/footerFragment”没有引用此版面中的其他id。我想它应该是footerFragmentId?而且框架版面是包装内容,里面没有任何内容。您确定它们可见并被单击吗?我稍后会测试它,谢谢