【问题标题】:CWAC Camera - Implement a custom guiCWAC Camera - 实现自定义 gui
【发布时间】:2013-09-20 19:23:55
【问题描述】:

我正在使用 commonsware 创建的库来制作一个简单的相机应用程序。在自述文件中有一个部分说明了这一点:

您可以继承 CameraFragment 并覆盖 onCreateView()。链到 获取 CameraFragment 自己的 UI 的超类,然后将其包装在 您自己的带有其他小部件的容器,并返回组合的 UI 来自你的 onCreateView()。

我对 Android Fragments 仍然不是很好,所以我希望有人能更好地向我解释一下。

我有两个活动(A、B)、一个片段(CamFragment)和两个布局(A、B)。我的第一个活动 (A) 加载具有单个按钮和 imageView 的布局 (A)。该按钮启动第二个活动 (B),它使用第二个布局 (B) 加载片段 (CamFragment)。第二个布局取自演示应用程序:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:ignore="MergeRootFrame"/>

所以,现在在我的应用程序中,我想要一个相机片段/第二个活动上的按钮,该按钮将在单击时使用图片()。按照自述文件中的说明,我需要先继承 CameraFragment 的子类。这很简单,我就是这样做的:

public class CamFragment extends CameraFragment {

接下来,我必须重写 onCreateView。再一次,就像在 v9 演示中一样,这是一个微不足道的任务。

  @Override
  public void onCreate(Bundle state) {
    super.onCreate(state);

    setHasOptionsMenu(true);
    setHost(new DemoCameraHost(getActivity()));
  }

下一部分是我真正感到困惑的地方,希望有人能提供帮助。

链接到超类以获取 CameraFragment 自己的 UI,然后包装 在您自己的容器中使用其他小部件,并返回 来自 onCreateView() 的组合 UI。

我只是不完全确定这意味着/意味着什么。如果有一个演示,展示一个没有 actionBar 的自定义相机 UI,那就太棒了,因为我觉得大多数开发人员不会将控件放入操作栏中。

编辑#1:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View uiFromParent=super.onCreateView(inflater, container, savedInstanceState);
    View yourUi = inflater.inflate(R.layout.main_cam, container, false);
    View theThingThatWillHoldThePreview = yourUi.findViewById(R.id.holder); // or whatever
    ((ViewGroup) theThingThatWillHoldThePreview).addView(uiFromParent); // with some appropriate LayoutParams
    return super.onCreateView(inflater, container, savedInstanceState);
}

main_cam.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/RelativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_weight="1"
        android:background="@color/abs__bright_foreground_holo_dark"
        android:keepScreenOn="true"
        tools:ignore="MergeRootFrame" >
    </FrameLayout>

    <ImageButton
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:background="@color/abs__bright_foreground_holo_dark"
        android:src="@drawable/ic_launcher"
        android:text="Capture" />

</RelativeLayout>

cam_fragment.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="MergeRootFrame"/>

【问题讨论】:

    标签: java android android-camera commonsware-cwac


    【解决方案1】:

    接下来,我必须重写 onCreateView。再一次,就像在 v9 演示中一样,这是一个微不足道的任务。

    您的代码没有覆盖onCreateView()。它会覆盖onCreate()

    我只是不完全确定这意味着/意味着什么。

    “链接到超类以获取 CameraFragment 自己的 UI”

    View uiFromParent=super.onCreateView(inflater, container, savedInstanceState);
    

    “然后用其他小部件将其包装在您自己的容器中”

    View yourUi=... // inflate something, create straight in Java, whatever
    View theThingThatWillHoldThePreview=yourUi.findViewById(...); // or whatever
    
    theThingThatWillHoldThePreview.addView(uiFromParent, ...); // with some appropriate LayoutParams
    

    “并从你的 onCreateView() 返回组合的 UI”

    return(yourUi);
    

    【讨论】:

    • 对不起,对于第一部分onCreateView,我是将其插入片段还是活动中?
    • @GuyLeStack:“我是将其插入片段还是活动中?” -- onCreateView() 进入CameraFragment 的子类。
    • 好的,所以对于您解决方案的底部,我有点困惑。我对布局和膨胀它们等(除了setContentView)不是很熟悉。 uiFromParent 和 yourUi 不应该相同。对不起,我真的很感谢你的回答,但我仍然“不明白”。在我的脑海中......我应该抓住用户界面,并以某种方式向它添加一个按钮。是的,在您的伪代码中,似乎有 3 个 View 对象是根布局/视图。
    • @GuyLeStack:“uiFromParent 和 yourUi 不应该相同”——不。 uiFromParent 为 UI 创建的(CameraView)。 yourUiyou 正在创建的 UI(从任何地方)并且您正在将 my UI 放入其中。
    • @GuyLeStack:当然,请记住,您不必执行任何这些操作。将我的片段与你的 UI 的其余部分放在一起。如果您绝对需要将CameraView 放在CameraFragment 不能去的地方,则子类化方法将是。或者,引用我的文档,“您可以将该 UI 作为 CameraFragment 的对等体,例如通过具有操作栏项目,就像演示应用程序所做的那样”。你可以有两个片段(我的和你的),或者三个片段(我的和你的两个),或者我的片段和你的一批其他小部件,等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多