Android Viewpager的并发症

Android Viewpager的并发症,android,android-fragments,android-viewpager,fragment-lifecycle,Android,Android Fragments,Android Viewpager,Fragment Lifecycle,我正在使用一个ViewPager,其中有3个片段 我知道当ViewPager第一次加载时,默认情况下会加载所有片段 最少3个片段,viewpager执行片段的所有生命周期方法 我注意到的问题: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflat

我正在使用一个ViewPager,其中有3个片段

我知道当ViewPager第一次加载时,默认情况下会加载所有片段

最少3个片段,viewpager执行片段的所有生命周期方法

我注意到的问题:

 @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,   
                  Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_dth, container, false);

   preferences= 
    PreferenceManager.getDefaultSharedPreferences(getActivity());
    editor = preferences.edit();


    editAmt = (EditText) v.findViewById(R.id.editAmt);
    browsplan = (Button) v.findViewById(R.id.browsplan);


    Log.e("DTH onCreateView ",""+page);

    String fontpath = "fonts/OpenSans-Regular.ttf";
    Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), 
    fontpath);

    editCustomerid.setTypeface(tf);
    editAmt.setTypeface(tf);

    token=preferences.getString("Token","-1");
    mobileNo=preferences.getString("userMobileNo","0");



    browsplan.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

          //new DTHOperator(getActivity()).execute();   HERE IT WORKS PROPERLY
        }
    });

    return v;
}

 @Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if(isVisibleToUser && isResumed()){
        new DTHOperator(getActivity()).execute();
        Toast.makeText(getActivity(),"setUserVisibleHint DTH  " 
       ,Toast.LENGTH_SHORT).show();
       }
    }

  public class DTHOperator extends AsyncTask<Context, Integer, String> {
    Context ctx;

    DTHOperator(Context ctx) {
        this.ctx = ctx;
    }

    @Override
    protected String doInBackground(Context... params) {
        List<NameValuePair> telecomdata = new ArrayList<NameValuePair>();
        String result;
        Log.d("Register Activity Token", /*preferences.getString("Token", "")*/token);

        telecomdata.add(new BasicNameValuePair("mobNo", /*preferences.getString("userMobileNo", "")*/mobileNo));
        telecomdata.add(new BasicNameValuePair("requestDate", Utilities.getApiCallTimeFormat()));
        telecomdata.add(new BasicNameValuePair("reqFrom", "APP"));
        Log.v("PostParameters", "telecomdata" + telecomdata);
        if (Connectivity.checkNetwork(ctx)) {
            result = rechargeUrl.queryRESTurlONline(ctx, "/GetDTHOperatorsService", "post", telecomdata, GenericConstants.PiPay_root);
        } else {
            result = GenericConstants.NETWORKNOTFOUND;
            displayToast("The Internet Connection appears to be offline");
        }


        return result;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        MyProgress.show(ctx, "", "");
    }

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

        try {
            if (result != null) {
                if (result.equalsIgnoreCase(GenericConstants.NETWORKNOTFOUND)) {
                    MyProgress.CancelDialog();
                    Toast.makeText(ctx,"The Internet Connection appears to be offline",Toast.LENGTH_SHORT).show();
                    return;
                }
                String[] resArr = result.split("delimiter_");
                if (!resArr[0].equals("500")) {
                    MyProgress.CancelDialog();
                    Log.d("DTHOperator Response ::", result);
                    JSONArray jsonArray = null;
                    JSONObject object = new JSONObject(result);
                    jsonArray = object.getJSONArray("data");

                    for (int i = 0; i < jsonArray.length(); i++) {
                        if (jsonArray.getJSONObject(i).has("opName")) {
                            operator.add(jsonArray.getJSONObject(i).getString("opName"));

                            Log.d("", " Question size " + operator.size());
                        }
                    }

                    if(MyProgress.isShowingProgress())
                        MyProgress.CancelDialog();

                        editAmt.setText("2000");  // NPE HERE Also setting the value  

                } else {
                    MyProgress.CancelDialog();
                    displayToast("Failure");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            MyProgress.CancelDialog();
        }finally {
            if(MyProgress.isShowingProgress())
                MyProgress.CancelDialog();
        }

    }
  • 每当我滑动viewpager时,所选片段不会再次调用其任何生命周期方法

  • 因此,我不能直接访问全局变量

    e、 g:如果我在OnCreateView()中初始化了一个首选项,那么当我试图通过初始化该片段的实例并调用该片段中的方法从活动访问它时,我将获得NPE

  • 而且,在第一次加载之后,甚至连onResume都不会被调用来获取任何片段

我想知道的:

 @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,   
                  Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_dth, container, false);

   preferences= 
    PreferenceManager.getDefaultSharedPreferences(getActivity());
    editor = preferences.edit();


    editAmt = (EditText) v.findViewById(R.id.editAmt);
    browsplan = (Button) v.findViewById(R.id.browsplan);


    Log.e("DTH onCreateView ",""+page);

    String fontpath = "fonts/OpenSans-Regular.ttf";
    Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), 
    fontpath);

    editCustomerid.setTypeface(tf);
    editAmt.setTypeface(tf);

    token=preferences.getString("Token","-1");
    mobileNo=preferences.getString("userMobileNo","0");



    browsplan.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

          //new DTHOperator(getActivity()).execute();   HERE IT WORKS PROPERLY
        }
    });

    return v;
}

 @Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if(isVisibleToUser && isResumed()){
        new DTHOperator(getActivity()).execute();
        Toast.makeText(getActivity(),"setUserVisibleHint DTH  " 
       ,Toast.LENGTH_SHORT).show();
       }
    }

  public class DTHOperator extends AsyncTask<Context, Integer, String> {
    Context ctx;

    DTHOperator(Context ctx) {
        this.ctx = ctx;
    }

    @Override
    protected String doInBackground(Context... params) {
        List<NameValuePair> telecomdata = new ArrayList<NameValuePair>();
        String result;
        Log.d("Register Activity Token", /*preferences.getString("Token", "")*/token);

        telecomdata.add(new BasicNameValuePair("mobNo", /*preferences.getString("userMobileNo", "")*/mobileNo));
        telecomdata.add(new BasicNameValuePair("requestDate", Utilities.getApiCallTimeFormat()));
        telecomdata.add(new BasicNameValuePair("reqFrom", "APP"));
        Log.v("PostParameters", "telecomdata" + telecomdata);
        if (Connectivity.checkNetwork(ctx)) {
            result = rechargeUrl.queryRESTurlONline(ctx, "/GetDTHOperatorsService", "post", telecomdata, GenericConstants.PiPay_root);
        } else {
            result = GenericConstants.NETWORKNOTFOUND;
            displayToast("The Internet Connection appears to be offline");
        }


        return result;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        MyProgress.show(ctx, "", "");
    }

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

        try {
            if (result != null) {
                if (result.equalsIgnoreCase(GenericConstants.NETWORKNOTFOUND)) {
                    MyProgress.CancelDialog();
                    Toast.makeText(ctx,"The Internet Connection appears to be offline",Toast.LENGTH_SHORT).show();
                    return;
                }
                String[] resArr = result.split("delimiter_");
                if (!resArr[0].equals("500")) {
                    MyProgress.CancelDialog();
                    Log.d("DTHOperator Response ::", result);
                    JSONArray jsonArray = null;
                    JSONObject object = new JSONObject(result);
                    jsonArray = object.getJSONArray("data");

                    for (int i = 0; i < jsonArray.length(); i++) {
                        if (jsonArray.getJSONObject(i).has("opName")) {
                            operator.add(jsonArray.getJSONObject(i).getString("opName"));

                            Log.d("", " Question size " + operator.size());
                        }
                    }

                    if(MyProgress.isShowingProgress())
                        MyProgress.CancelDialog();

                        editAmt.setText("2000");  // NPE HERE Also setting the value  

                } else {
                    MyProgress.CancelDialog();
                    displayToast("Failure");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            MyProgress.CancelDialog();
        }finally {
            if(MyProgress.isShowingProgress())
                MyProgress.CancelDialog();
        }

    }
  • 在onCreateView()中初始化视图和首选项后,如何访问它们

  • 但是对于在onCreateView()中初始化的按钮,单击它会调用web服务,并按照我的要求完美地工作。如何

在过去的3天里,我一直在处理这些问题,在谷歌上搜索了很多,但都没有找到我的答案

任何帮助都将不胜感激

片段代码:

 @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,   
                  Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_dth, container, false);

   preferences= 
    PreferenceManager.getDefaultSharedPreferences(getActivity());
    editor = preferences.edit();


    editAmt = (EditText) v.findViewById(R.id.editAmt);
    browsplan = (Button) v.findViewById(R.id.browsplan);


    Log.e("DTH onCreateView ",""+page);

    String fontpath = "fonts/OpenSans-Regular.ttf";
    Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), 
    fontpath);

    editCustomerid.setTypeface(tf);
    editAmt.setTypeface(tf);

    token=preferences.getString("Token","-1");
    mobileNo=preferences.getString("userMobileNo","0");



    browsplan.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

          //new DTHOperator(getActivity()).execute();   HERE IT WORKS PROPERLY
        }
    });

    return v;
}

 @Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if(isVisibleToUser && isResumed()){
        new DTHOperator(getActivity()).execute();
        Toast.makeText(getActivity(),"setUserVisibleHint DTH  " 
       ,Toast.LENGTH_SHORT).show();
       }
    }

  public class DTHOperator extends AsyncTask<Context, Integer, String> {
    Context ctx;

    DTHOperator(Context ctx) {
        this.ctx = ctx;
    }

    @Override
    protected String doInBackground(Context... params) {
        List<NameValuePair> telecomdata = new ArrayList<NameValuePair>();
        String result;
        Log.d("Register Activity Token", /*preferences.getString("Token", "")*/token);

        telecomdata.add(new BasicNameValuePair("mobNo", /*preferences.getString("userMobileNo", "")*/mobileNo));
        telecomdata.add(new BasicNameValuePair("requestDate", Utilities.getApiCallTimeFormat()));
        telecomdata.add(new BasicNameValuePair("reqFrom", "APP"));
        Log.v("PostParameters", "telecomdata" + telecomdata);
        if (Connectivity.checkNetwork(ctx)) {
            result = rechargeUrl.queryRESTurlONline(ctx, "/GetDTHOperatorsService", "post", telecomdata, GenericConstants.PiPay_root);
        } else {
            result = GenericConstants.NETWORKNOTFOUND;
            displayToast("The Internet Connection appears to be offline");
        }


        return result;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        MyProgress.show(ctx, "", "");
    }

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

        try {
            if (result != null) {
                if (result.equalsIgnoreCase(GenericConstants.NETWORKNOTFOUND)) {
                    MyProgress.CancelDialog();
                    Toast.makeText(ctx,"The Internet Connection appears to be offline",Toast.LENGTH_SHORT).show();
                    return;
                }
                String[] resArr = result.split("delimiter_");
                if (!resArr[0].equals("500")) {
                    MyProgress.CancelDialog();
                    Log.d("DTHOperator Response ::", result);
                    JSONArray jsonArray = null;
                    JSONObject object = new JSONObject(result);
                    jsonArray = object.getJSONArray("data");

                    for (int i = 0; i < jsonArray.length(); i++) {
                        if (jsonArray.getJSONObject(i).has("opName")) {
                            operator.add(jsonArray.getJSONObject(i).getString("opName"));

                            Log.d("", " Question size " + operator.size());
                        }
                    }

                    if(MyProgress.isShowingProgress())
                        MyProgress.CancelDialog();

                        editAmt.setText("2000");  // NPE HERE Also setting the value  

                } else {
                    MyProgress.CancelDialog();
                    displayToast("Failure");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            MyProgress.CancelDialog();
        }finally {
            if(MyProgress.isShowingProgress())
                MyProgress.CancelDialog();
        }

    }
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图v=充气机。充气(R.layout.activity\u dth,容器,假);
首选项=
GetDefaultSharedReferences(getActivity());
editor=preferences.edit();
editAmt=(EditText)v.findViewById(R.id.editAmt);
browsplan=(按钮)v.findviewbyd(R.id.browsplan);
Log.e(“DTH onCreateView”,“”+第页);
String fontpath=“font/OpenSans Regular.ttf”;
Typeface tf=Typeface.createFromAsset(getActivity().getAssets(),
fontpath);
editCustomerid.setTypeface(tf);
编辑金额设置字体(tf);
token=preferences.getString(“token”、“-1”);
mobileNo=preferences.getString(“userMobileNo”,“0”);
browsplan.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//新的DTHOperator(getActivity()).execute();在这里它可以正常工作
}
});
返回v;
}
@凌驾
public void setUserVisibleHint(布尔值isVisibleToUser){
super.setUserVisibleHint(isVisibleToUser);
如果(isVisibleToUser&&isResumed()){
新的DTHOperator(getActivity()).execute();
Toast.makeText(getActivity(),“setUserVisibleHint DTH”
,Toast.LENGTH_SHORT)show();
}
}
公共类DTHOperator扩展异步任务{
上下文ctx;
数据处理器(上下文ctx){
this.ctx=ctx;
}
@凌驾
受保护字符串doInBackground(上下文…参数){
列表数据=新的ArrayList();
字符串结果;
Log.d(“Register Activity Token”,/*preferences.getString(“Token”,”)*/Token);
telecomdata.add(新的BasicNameValuePair(“mobNo”,/*preferences.getString(“userMobileNo”,下称“)*/mobileNo));
添加(新的BasicNameValuePair(“requestDate”,Utilities.getApiCallTimeFormat());
添加(新的BasicNameValuePair(“reqFrom”、“APP”);
Log.v(“后参数”、“远程数据”+远程数据);
if(连通性检查网络(ctx)){
结果=rechargeUrl.queryRESTurlONline(ctx,“/GetDTHOperatorsService”,“post”,telecomdata,GenericConstants.PiPay_root);
}否则{
结果=GenericConstants.NETWORKNOTFOUND;
displayToast(“Internet连接似乎处于脱机状态”);
}
返回结果;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
MyProgress.show(ctx,“,”);
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
试一试{
如果(结果!=null){
if(result.equalsIgnoreCase(GenericConstants.NETWORKNOTFOUND)){
MyProgress.CancelDialog();
Toast.makeText(ctx,“Internet连接似乎处于脱机状态”,Toast.LENGTH_SHORT.show();
返回;
}
String[]resArr=result.split(“分隔符”);
如果(!resArr[0]。等于(“500”)){
MyProgress.CancelDialog();
Log.d(“DTHOperator响应:”,结果);
JSONArray JSONArray=null;
JSONObject对象=新的JSONObject(结果);
jsonArray=object.getJSONArray(“数据”);
for(int i=0;i
您可以保留
片段的实例,这些片段在您的
查看页面中使用

ViewPagerAdapter
中定义
SparseArray
并覆盖以下方法:

SparseArray<Fragment> registeredFragments = new SparseArray<>();

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    registeredFragments.put(position, fragment);
    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    registeredFragments.remove(position);
    super.destroyItem(container, position, object);
}

public Fragment getRegisteredFragment(int position) {
    return registeredFragments.get(position);
}
TextView textView = yourFragmentInstance.mTetxView;
我希望这对你有帮助。祝你好运

编辑:

您可以定义片段的公共视图或为视图定义getter方法
TextView textView = yourFragmentInstance.mTetxView;
TextView textview = yourFragmentInstance.getTextView();
@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isResumed()) {

        }
    }
public class TabAdapter extends FragmentPagerAdapter {
    private Map<Integer, String> tagMap = new HashMap<>(2); // matches tab count

    public TabAdapter(FragmentManager fMgr) {
        super(fMgr);
    }
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!
    // Capturing the tag that is auto-generated
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment frag = (Fragment) super.instantiateItem(container, position);

        tagMap.put(position, frag.getTag());

        return frag;
    }

    /**
     * Return the Fragment associated with a specified position.
     *
     * @param position
     */
    @Override
    public Fragment getItem(int position) {
        Fragment frag = null;

        ...

        return frag;
    }

    /**
     * Return the number of views available.
     */
    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        String title = null;

        ...

        return title;
    }
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!
    public String getFragmentTag(int position) {
        return tagMap.get(position);
    }
} // end of class TabAdapter
String fragTag = tabAdapter.getFragmentTag(tabPosition);
Fragment frag = getSupportFragmentManager().findFragmentByTag(fragTag);