简体   繁体   中英

How to show different layouts in one activity?

I have a activity in that I need to change the layout.

In the first layout I have four buttons to display and in the second I need a GridView to display images.

I need to show the second layout in an AsyncTask onPostExecute method.

For now, I'm trying to set two setContentViews, but I get the following exception: ClassCastException

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_focusarea); videoBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { new LoadFiles().execute(); } }); animateBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { new LoadFiles().execute(); } }); pdfBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { new LoadPDFFiles().execute(); } }); } 

And in my postExecute i try like this

  protected void onPostExecute(String file_url) { pDialog.dismiss(); runOnUiThread(new Runnable() { public void run() { setContentView(R.layout.gallery); girGridView=(GridView) findViewById(R.id.gridView1_bir); girGridView.setAdapter(new ImageAdapter(this)); girGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position,long arg3) { Toast.makeText(getApplicationContext(), GridViewConfig.getResim_list().get(position), Toast.LENGTH_SHORT).show(); } }); } }); 

Instead of using two layouts use a single layout as bellow

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<LinearLayout
    android:id="@+id/MyLayoutOne"
    android:layout_width="fill_parent"
    android:visibility="gone"
    android:layout_height="fill_parent" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="Hi This is my first layout" />


     <!-- Your first layout contents add here-->



</LinearLayout>

<LinearLayout
    android:id="@+id/MyLayoutTwo"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="Hi This is my Second layout" />


    <!-- Your second layout contents add here -->


</LinearLayout>

</LinearLayout>

Add your first layout contents inside MyLayoutOne and second layout contents inside MyLayoutTwo

And use following codes inside your activity,

public class MainActivity extends Activity {


LinearLayout MyLayoutOne;
LinearLayout MyLayoutTwo;

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

    MyLayoutOne=(LinearLayout)findViewById(R.id.MyLayoutOne);
    MyLayoutTwo=(LinearLayout)findViewById(R.id.MyLayoutTwo);


    // this will make first layout visible
    MyLayoutOne.setVisibility(View.VISIBLE);


    // this will make second layout hidden from your layout
    MyLayoutTwo.setVisibility(View.GONE);



    //=========================================

    //in your post create add this codes 

    //=========================================

    // this will make first layout hidden
    MyLayoutOne.setVisibility(View.GONE);

    // this will make second layout visible in your layout
    MyLayoutTwo.setVisibility(View.VISIBLE);

    //=========================================


}



}

This is a simplest method you must study fragments for better UI management. You can use viewflipper also.

So Study Fragments and Viewflipper..

Instead of that you can have a layout that contains both a wrapper for your four buttons and other for the GridView while this last one is with visibility set to 'gone'.

When the AsycTask finished, you hide the buttons layout and show the GridView layout.

Why don't you set one content view with two layouts or two fragments? A layout can be like this

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/text1">          
    </Button>
    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/text2">          
    </Button>
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/text3">          
    </Button>
    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/text4">          
    </Button>
    <GridView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         ...
    </GridView>
</LinearLayout>
Use one setContentView() and define separates Linear/Relative layout one for buttons and second for gridView.And hide/show the Views according to your need.

AsyncTask的onPostExecute在UI线程上运行,因此您无需显式指定runonUiThread,而不是使用2个setcontent视图,最好在布局文件中有2个视图并使之根据需要可见不可见。

Friend change the id of wrapper1 to child as below,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Focusarea" >

<LinearLayout
    android:id="@+id/wrapper1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:visibility="gone" >

    <GridView
        android:id="@+id/gridView1_bir"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
    </GridView>
</LinearLayout>

<RelativeLayout
    android:id="@+id/wrapper2"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/vid_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="18dp"
       android:src="@drawable/ic_launcher" />


</RelativeLayout>

</LinearLayout>

and initialize your linear layouts outside oncreate as below,

LinearLayout wrapper1;
RelativeLayout wrapper2;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    wrapper1 = (LinearLayout)findViewById(R.id.wrapper1);
    wrapper2=(RelativeLayout)findViewById(R.id.wrapper2);


    // this will make first layout visible
    wrapper2.setVisibility(View.VISIBLE);


    // this will make second layout hidden from your layout
    wrapper1.setVisibility(View.GONE);


    ImageView videoBtn = (ImageView) findViewById(R.id.vid_btn);
    ImageView animateBtn = (ImageView) findViewById(R.id.anit_btn);
    ImageView pdfBtn = (ImageView) findViewById(R.id.pdf_btn);

    videoBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                new LoadFiles().execute();                         
            }
    });
    animateBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                    new LoadFiles().execute();                     
            }
    });
    pdfBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                    new LoadPDFFiles().execute();                  
            }
    });
    }
    protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting VIDEOS
            pDialog.dismiss();     
            vid=new ArrayList<String>(new ArrayList<String>(vid));
            videoUrl=parsing.parse(videoUrl);
            System.out.println("VIDEO URL" +videoUrl);
                    runOnUiThread(new Runnable() {
                            public void run() {


                            //--here you wont need to initialize again--

                                // this will make first layout visible
                                wrapper1.setVisibility(View.VISIBLE);
                                // this will make second layout hidden from your layout
                                wrapper2.setVisibility(View.GONE);

                            girGridView=(GridView) findViewById(R.id.gridView1_bir);
                            //ListView gibi buna da adapter set ediliyor.
                            girGridView.setAdapter(new ImageAdapter(this));                            
                            girGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View view, int position,long arg3) {
    Toast.makeText(getApplicationContext(), GridViewConfig.getResim_list().get(position), Toast.LENGTH_SHORT).show();                              
                                            }
                                    });
                            }
        });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM