Android dynamic fragment load indicator visibility will not be set

I use Android snippets to download code in my application. To create a simple bootloader I have LoadingFragment extends Fragment, and then fragments of my classes extend it, for example: MyFragment extends LoadingFragment.

LoadingFragmenthas hideLoaderand showLoader, which theoretically my fragment of the subclass should be able to call onCreateViewand onPostExecuteto show and hide the progress bar between loads.

The layout is wise I have main_layout.xmlone that has a framelayout for dynamic snippets and a static relativelayout that contains a progress bar.

At the moment, my fragments are loading and replacing onclick elements from each other, but I deleted this code.

Problem

The problem is that setVisibiltyin LoadingFragmenthas zero effect when calling it from subclasses, for example MyFragment, why is this?

I gave LoadingFragmentmy own variable View viewMaster, which, it seems to me, should refer to main_layout, but still changes in visibility seem to have no effect?

Mainactivity

public class MainActivity extends AppCompatActivity {

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

        MyFragment myFragment = MyFragment.newInstance();

        getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment_holder, myFragment).commit();
    }
}

LoadingFragment

public class LoadingFragment extends Fragment {

    View viewMaster;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        viewMaster = inflater.inflate(R.layout.main_layout, container, false);

        return viewMaster;
    }

    public void showLoader() {

        viewMaster.findViewById(R.id.fragment_holder).setVisibility(View.INVISIBLE);
        viewMaster.findViewById(R.id.loading).setVisibility(View.VISIBLE);
    }

    public void hideLoader() {

        viewMaster.findViewById(R.id.fragment_holder).setVisibility(View.VISIBLE);
        viewMaster.findViewById(R.id.loading).setVisibility(View.INVISIBLE);
    }
}

Myfragment

public class MyFragment extends LoadingFragment {

    View view;

    public MyFragment() {}

    public static MyFragment newInstance() {
        MyFragment fragment = new MyFragment();
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);
        super.showLoader();

        view = inflater.inflate(R.layout.fragment_lans, container, false);

        MyFragment.ApiCallJob apicalljob = new MyFragment.ApiCallJob();
        apicalljob.execute("a string");

        return view;
    }

    public class ApiCallJob extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String[] params) {
            // do things
        }

        @Override
        protected void onPostExecute(String data) {
            // do things
            // tried both to be sure but they should do the same?  
            hideLoader();
            MyFragment.super.hideLoader();
        }
    }

}

main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="app.stats.MainActivity"
    android:orientation="horizontal">

    <FrameLayout
        android:id="@+id/fragment_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

    <RelativeLayout
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ProgressBar
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/progress_bar"/>
    </RelativeLayout>

</RelativeLayout>
+4
source share
3 answers

The problem is that setVisibilityin LoadingFragmenthas zero effect when calling it from subclasses, for example MyFragment, why is this?

Let's see what happens when called MyFragment onCreateView:

super onCreateView, LoadingFragment. main_layout . , MyFragment (.. View mainLayout = super.onCreateView(inflater, container, savedInstanceState);)

, loading, . LoadingFragment.

R.layout.fragment_lans ( ) , .

, , LoadingFragment , .

, , setVisibility , .

, , .

  • ProgressBar . RelativeLayout, . android:visibility="gone", :

            <ProgressBar
                android:id="@+id/progress_bar"
                style="?android:attr/progressBarStyleLarge"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:visibility="gone"/>
    

    LoadingFragment, fragment_lans.xml. <include>, .

  • LoadingFragment , a) b) :

    public class LoadingFragment extends Fragment {
    
        public void showLoader() {
    
            if (getView() != null) {
               View progressBar = getView().findViewById(R.id.progress_bar);
               if (progressBar != null) {
                   progressBar.setVisibility(View.VISIBLE);
               }
            }
        }
    
        public void hideLoader() {
    
            if (getView() != null) {
               View progressBar = getView().findViewById(R.id.progress_bar);
               if (progressBar != null) {
                   progressBar.setVisibility(View.GONE);
               }
            }
        }
    }
    

, .


, , :

main_layout, , .

, . .

:

  • interface ProgressDisplay {
    
        public void showProgress();
    
        public void hideProgress();
    }
    
  •     public class MainActivity extends AppCompatActivity implements ProgressDisplay {
    

    ...

        public void showProgress() {
            findViewById(R.id.loading).setVisibility(View.VISIBLE);
        }
    
        public void hideProgress() {
            findViewById(R.id.loading).setVisibility(View.GONE);
        }
    
  • LoadingFragment, :

        protected void showProgress() {
            if (getActivity() instanceof ProgressDisplay) {
                ((ProgressDisplay) getActivity()).showProgress();
            }
        }
    
        protected void hideProgress() {
            if (getActivity() instanceof ProgressDisplay) {
                ((ProgressDisplay) getActivity()).hideProgress();
            }
        }
    

, , ProgressDisplay, LoadingFragment .

LoadingActivity.

+5

setVisibility showLoader , , .

- (MyFragment):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = super.onCreateView(inflater, container, savedInstanceState);
    ViewGroup vg = (ViewGroup) v.findViewById(R.id.fragment_holder)

    inflater.inflate(R.layout.fragment_lans, vg, true);

    MyFragment.ApiCallJob apicalljob = new MyFragment.ApiCallJob();
    showLoader();
    apicalljob.execute("a string");


    return v;
}
+2

, .

View Binding butterknife, , .

   import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;

import com.emerson.techdayapp.R;
import com.emerson.techdayapp.view.activity.MainActivity ;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * Base fragment created to be extended by every fragment in this application. This class provides
 * dependency injection configuration, ButterKnife Android library configuration and some methods
 * common to every fragment.
 */
public abstract class BaseFragment extends Fragment {

    private Unbinder unbinder;

    @BindView(R.id.htab_toolbar)
    Toolbar mToolbar;
    @BindView(R.id.loading_view)
    ProgressBar loadingView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(getFragmentLayout(), container, false);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        //bind view
        injectViews(view);

        //set page title
        setUpToolBar(getPageTitle());

        //add click listeners
        setUpViewEvents();

        //make service call
        fillData();
    }

    /**
     * @return resource if of fragment layout
     */
    protected abstract int getFragmentLayout();

    /**
     * Set toolbar title
     *
     * @return
     */
    protected abstract String getPageTitle();

    /**
     * Add click listeners
     */
    protected abstract void setUpViewEvents();

    /**
     * Make Web serve calls here
     */
    protected abstract void fillData();


    /**
     * Inject View
     *
     * @param view
     */
    private void injectViews(final View view) {
        unbinder = ButterKnife.bind(this, view);
    }


    /**
     * Set up toolbar
     *
     * @param pageTitle
     */
    private void setUpToolBar(String pageTitle) {

        getActivity().setTitle(pageTitle);

        if (mToolbar != null) {
            ((MainActivity ) getActivity()).setSupportActionBar(mToolbar);

            ((MainActivity ) getActivity()).getSupportActionBar()
                    .setDisplayHomeAsUpEnabled(true);

            mToolbar.setNavigationIcon(R.drawable.ic_drawer);

            mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    //TODO what to do on back press
                }
            });

            mToolbar.setTitleTextColor(Color.WHITE);
        }
    }

    public void showProgressDialog() {
        if (null != loadingView)
            loadingView.setVisibility(View.VISIBLE);
    }

    public void dismissProgressDialog() {

        if (null != loadingView)
            loadingView.setVisibility(View.GONE);
    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}

,

public class MyFragment extends BaseFragment {

    public MyFragment() {
    }

    public static MyFragment newInstance() {
        MyFragment fragment = new MyFragment();
        return fragment;
    }

    @Override
    protected int getFragmentLayout() {

        //put your frag layout id here
        return R.layout.frag_pulse;
    }

    @Override
    protected String getPageTitle() {

        //Add some title to page
        return "Some Title";
    }

    @Override
    protected void setUpViewEvents() {

    }

    @Override
    protected void fillData() {

        new AsyncTask<String, Void, String>() {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();

                //Show Progress
                showProgressDialog();
            }

            @Override
            protected String doInBackground(String... strings) {

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);

                //Hide Progress
                dismissProgressDialog();
            }
        };

    }
} 

, htab_toolbar id loading_view,

0

Source: https://habr.com/ru/post/1663753/


All Articles