使用自定义布局+一个子项创建自定义viewGroup

时间:2015-08-20 21:12:31

标签: android android-custom-view

我想创建一个允许我简化ViewFlipper的组件。

我的鳍状肢的第一个视图是progressBar,它向用户显示内容正在加载,而我的鳍状肢中的第二个视图是我的内容(例如另一个布局)。 换句话说,我想简化这个:

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

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

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

</ViewFlipper>

我的所有活动的第一个视图(progressBar)总是相同的,因此我想要创建的组件可以像这样使用(文件layout-activity.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

    <com.example.fred.myapplication.MyCustomComponent
        android:id="@+id/myComponent"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

    </com.example.fred.myapplication.MyCustomComponent>

</LinearLayout>

我开始创建这样的组件:

public class MyCustomComponent extends RelativeLayout {

ViewFlipper myFlipper;

public MyCustomComponent(Context context) {
    super(context);
}

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

public MyCustomComponent(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    //the main template
    View template = inflate(getContext(), R.layout.template, null);

    //get the viewFlipper from my template
    myFlipper = (ViewFlipper) template.findViewById(R.id.myFlipper);

    //add the first child of my custom component to the view flipper
    myFlipper.addView(getChildAt(0));
}

/**
 * Show the progressBar
 */
public void showProgressBar(){
    myFlipper.setDisplayedChild(0);
}
/**
 * Show my custom content which can be a textview in my example but also a LinearLayout for example...
 */
public void showContent(){
    myFlipper.setDisplayedChild(1);
}
}

包含viewFlipper的template.xml是:

<?xml version="1.0" encoding="utf-8"?>
<ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myFlipper"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</ViewFlipper>

在我的活动中,我想使用我的自定义组件:

public class MainActivity extends Activity {

MyCustomComponent myCustomComponent;

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

    myCustomComponent = (MyCustomComponent) findViewById(R.id.myComponent);
    myCustomComponent.showProgressBar();
    loadLongStuff();
}

private void loadLongStuff() {
    //processing... long stuff
    //working again...

    //at the end, show my content loaded
    myCustomComponent.showContent();
}
}

我创建了我在这里写的每个文件,但它不起作用:我的应用程序崩溃但我没有任何堆栈跟踪....你能告诉我什么是错的吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您还没有能够解决这个问题,我相信问题在于您错过了onMeasure方法。

See Google's example for reference

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // Do something
}

同样,Google的示例提供了一些关于如何使用此方法以及如何使用此方法的精彩演示。

干杯!