0

Android で折りたたみ/展開フォームを作成する必要があります。この目的のためにRelativeLayoutまたはのいずれかを使用することを考えています。TableLayoutしかし、Androidでこれらのフォームを展開および非表示にするXML要素は何ですか?

何を言っているのかわからない場合は、Sales Forceのようなアプリケーションを例に挙げてください。そこには、すべてのフォームにこれらの拡張可能なメニューがあります。これどうやってするの?

以下は例です (Sales Force から取得)。

ここに画像の説明を入力

これらを展開すると下のようになります

ここに画像の説明を入力

4

2 に答える 2

1

次のことができます。次のレイアウトを作成します。

1. A Heading or a textview with the label contacts
2. Below it a layout that has forms related to it
3. Add another textview below #2 and name it address
4. Add a lyout below #3 .

レイアウト 2 と 4 では、最初のケースで可視性が失われます

ユーザーがレイアウト 1 または最初のテキストビューをタップすると、レイアウト 2 が表示され、その逆も同様です。2 番目のテキストビューでも同じことを行います。

それが役立つことを願っています.!

于 2013-10-24T10:08:39.073 に答える
0

私は同様の問題を抱えていました。フォームの一部をセクションに隠して、この問題のクラスを作成したいと考えています。

public class section extends LinearLayout{
    public LinearLayout container;
    public Button toggler;
    public section(Context context, String section_name, String section_state) {
        super(context);
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.flxsection, this);
        container = (LinearLayout) this.findViewById(R.id.container);
        container.setVisibility(section_state.equals("0") ? View.GONE:View.VISIBLE);
        toggler = ((Button)this.findViewById(R.id.section_toggle));
        toggler.setTag(section_state);
        toggler.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                String tag = (String) v.getTag();   
                v.setTag(tag.equals("0") ? "1":"0");
                if(tag.equals("0")){expand(container,false);}else{collapse(container,false);}
                setImage(tag.equals("0"));
            }

        });
        toggler.setText(" " + section_name);
        setImage(section_state.equals("1"));
        setTextSize();
    }

    public void setTextSize(){
        toggler.setTextSize(GV.Style.TextSize);
    }

    public void setImage(boolean open){
        int a = open ? R.drawable.minus_48_white: R.drawable.plus_48_white;
        Drawable img = main.res.getDrawable(a);
        final float scale = main.res.getDisplayMetrics().density;
        int size = (int) (12 * scale + 0.5f);
        img.setBounds(0,0,size,size);
        toggler.setCompoundDrawables(img,null,null,null);
    }

}

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:focusable="false"
android:layout_marginLeft="4dip"
android:layout_marginRight="4dip"
android:orientation="vertical" >
<Button
    android:id="@+id/section_toggle"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="4dip"
    android:layout_marginTop="4dip"
    android:background="@drawable/section"
    android:drawableLeft="@drawable/plus_48"
    android:focusable="false"
    android:gravity="left|center_vertical"
    android:padding="6dip"
    android:textAppearance="?android:attr/textAppearanceLargeInverse"
    android:textSize="22dip" />
<LinearLayout 
    android:id="@+id/container"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:background="@android:color/transparent"
    android:orientation="vertical" >
</LinearLayout>  

展開と折りたたみ:

public static void expand(final View v,boolean quick) {

    v.requestLayout();
    v.measure(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    final int targtetHeight = v.getMeasuredHeight();

    v.getLayoutParams().height = 0;
    v.getLayoutParams().width = LayoutParams.FILL_PARENT; 
    v.setVisibility(View.VISIBLE);
    if(quick){
        v.getLayoutParams().height =  LayoutParams.WRAP_CONTENT;
        v.requestLayout();

    }else{
          android.view.animation.Animation a = new android.view.animation.Animation()
        {
            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                v.getLayoutParams().height = interpolatedTime == 1
                        ? LayoutParams.WRAP_CONTENT
                        : (int)(targtetHeight * interpolatedTime);
                v.requestLayout();

            }

            @Override
            public boolean willChangeBounds() {
                return true;
            }
        };

        // 1dp/ms
        int duration  = (int)(targtetHeight / v.getContext().getResources().getDisplayMetrics().density);
        if(duration> 500)duration=500;
        a.setDuration(duration);
        //(int)(targtetHeight / v.getContext().getResources().getDisplayMetrics().density)
        v.startAnimation(a);
    }

}

public static void collapse(final View v,boolean quick) {
    v.requestLayout();
    final int initialHeight = v.getMeasuredHeight();
    if(quick){
        v.setVisibility(View.GONE);
        v.requestLayout();

    }else{
         android.view.animation.Animation a = new android.view.animation.Animation()
        {
            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                if(interpolatedTime == 1){
                    v.setVisibility(View.GONE);

                }else{

                    v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                    v.requestLayout();
                }
            }

            @Override
            public boolean willChangeBounds() {
                return true;
            }
        };

        // 1dp/ms
        int duration  = (int)( initialHeight/ v.getContext().getResources().getDisplayMetrics().density);
        if(duration> 500)duration=500;
        a.setDuration(duration);
        v.startAnimation(a);
    }
}

フォームを作成してセクションが必要な場合は、このクラスのインスタンスを作成してコントロールを追加します。

最高のパフォーマンスを得るには、ハードウェア アクセラレーションをオンにする必要がある場合があります

編集:使用法は次のようになります:

section s = new section(context, section_name, section_state);
s.container.addView([your view 1]); 
s.container.addView([your view 2]); 
s.container.addView([your view 3]); 
//...
form.addView(s);
于 2013-10-24T07:05:49.497 に答える