One activity, two views. How and where do I inflat

2019-08-05 08:54发布

问题:

I have an activity that can show two different layouts. Both of the layouts are pre-defined (XML). Basically, if a condition is met, then layout A should be displayed. If the condition fails, then layout B should be displayed.

Layout A is a simplistic Linear Layout - it's my main "form", so to speak. Layout B is a simplistic Relative Layout - it's a placeholder until some data can be downloaded. Once the data is downloaded (and a notification is sent), then I want to remove Layout B and display Layout A.

I've tried calling the invalidate() method on Layout B in the onResume() method of my Activity but that doesn't work.

I'm not sure what approach I should take, in (1) where to "correctly" switch the layouts, and (2) how I should go about displaying it. I'm assuming I need to inflate Layout A when my condition is met, but I'm not 100% sure about that.

Edit: Snipped of my onCreate() method:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layoutA); // will happen 99% of the time
    ...
    if (!dbHelper.tableIsPopulated()) {
        setContentView(R.layout.layoutB); // show placeholder bc no data exists
        getData();
    }
}

回答1:

Unless you have a reason to not use a background Thread, I suggest using an AsyncTask and using a progress bar. It will be less costly than using a dummy Layout just as a placeholder until you get the data. And you said it won't be used but 1% of the time. Seems like a waste in my opinion

 public class TalkToServer extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);

        }

        @Override
        protected String doInBackground(String... params) {
        //do your work here
            return something;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
               // do something with data here-display it or send to mainactivity
    }

You apparently know about AsyncTask but Here are the Docs for future visitors and it has an example of using the ProgressDialog.

Note

Since it isn't an inner class you will just need to pass your Context to the constructor of your AsyncTask if you are going to show your ProgressDialog from there.



回答2:

Here is a link to a similar question Inflate a view / layout into another layout? and there is a possible solution there