簡體   English   中英

如何處理標簽片段中的后退按鈕?

[英]How to handle back button in tab's fragment?

我有一個活動,有2個片段,它們的名稱是AddressFragment和從BaseFragment擴展的ProfileFragment。 我如何處理標簽片段中的后退按鈕。 如果顯示了info_ll(linearlayout),則按下后退按鈕時將顯示一個recyclerview,如果顯示了recyclerview,則當單擊后退按鈕時單擊完成活動

public class ProfileActivity extends AppCompatActivity{
TabLayout tabLayout;
ViewPager viewPager;

public  void setTv_name(String tv_name) {
    ProfileActivity.tv_name.setText(tv_name);
}

public  void setTv_email(String tv_email) {
    ProfileActivity.tv_email.setText(tv_email);
}

public  void setTv_phone(String tv_phone) {
    ProfileActivity.tv_phone.setText(tv_phone);
}

public static MyTextView tv_name;
public static MyTextView tv_email;
public static MyTextView tv_phone;
CircularImageView iv_profile;
ImageButton btn_back;
BaseFragment currentFragment;


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

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);


    TabLayout tabhost = (TabLayout) this.findViewById(R.id.tabs);
    tabhost.getTabAt(getIntent().getIntExtra("go_to",0)).select();

    tv_name= (MyTextView) findViewById(R.id.tv_name);
    tv_email= (MyTextView)findViewById(R.id.tv_email);
    tv_phone= (MyTextView)findViewById(R.id.tv_phone);
    iv_profile= (CircularImageView) findViewById(R.id.profile);
    btn_back= (ImageButton) findViewById(R.id.btn_Back);
    btn_back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new ProfileFragment(), "ویرایش اطلاعات");
    adapter.addFragment(new AddressFragment(), "آدرس های منتخب");
    viewPager.setAdapter(adapter);
}



class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        currentFragment = null;

        switch (position) {
            case 0:
                currentFragment = new ProfileFragment();
                break;
            case 1:
                currentFragment = new AddressFragment();
                break;
        }
        return currentFragment;
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
public void setImage(){
    if(!DataContainer.getObject().getProfileImagePath().equals("None"))
        Glide.with(this).load(DataContainer.getObject().getProfileImagePath()).into(iv_profile);
}

@Override
public void onBackPressed() {



    if(currentFragment == null || !currentFragment.onBackPressed())
        super.onBackPressed();


}

}

地址片段

public class AddressFragment extends BaseFragment {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

ProgressDialog pDialog;
int pDilog_Counter=0;
private View rootView;
private RecyclerView recyclerView;
MyEditText et_title;
MyEditText et_address;
LinearLayout info_ll;
Button btn_edit;
ImageButton btn_location;
FloatingActionButton fab;
double latitude;
double longitude;
public static final int RESULT_OK = -1;
int status=0;
int profileID=0;



public AddressFragment() {
}
public static AddressFragment newInstance(String param1, String param2) {
    AddressFragment fragment = new AddressFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }

}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    rootView = inflater.inflate(R.layout.fragment_address, container, false);

    info_ll= (LinearLayout) rootView.findViewById(R.id.info_ll);
    et_title= (MyEditText) rootView.findViewById(R.id.et_title);
    et_address= (MyEditText) rootView.findViewById(R.id.et_address);
    btn_edit= (Button) rootView.findViewById(R.id.btn_edit);
    btn_location= (ImageButton) rootView.findViewById(R.id.btn_location);
    fab= (FloatingActionButton) rootView.findViewById(R.id.fab);
    recyclerView= (RecyclerView) rootView.findViewById(R.id.Address_recycler);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            recyclerView.setVisibility(View.GONE);
            fab.setVisibility(View.GONE);
            info_ll.setVisibility(View.VISIBLE);
            status=0;
            btn_edit.setText("ثبت");
            //PAProfileAddressAdd();
        }

    });



private static class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.ViewHolder> {
    private JSONArray Addresses;
    AddressFragment addressFragment;

    public SimpleAdapter(AddressFragment addressFragment, JSONArray AddressArray) {
        this.addressFragment=addressFragment;
        this.Addresses=AddressArray;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.address_recyclerview_item, parent, false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(position);
    }

    @Override
    public int getItemCount() {
        return Addresses.length();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private MyTextView title;
        private int position;
        public ViewHolder(View itemView) {
            super(itemView);
            title = (MyTextView) itemView.findViewById(R.id.address_txt);
            itemView.setOnClickListener(this);
        }

        public void bind(int position) {
            this.position = position;
            try {
                title.setText(Addresses.getJSONObject(position).getString("Title"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onClick(View view) {
            addressFragment.status=1;
            addressFragment.rootView.findViewById(R.id.Address_recycler).setVisibility(View.GONE);
            addressFragment.rootView.findViewById(R.id.fab).setVisibility(View.GONE);
            addressFragment.rootView.findViewById(R.id.info_ll).setVisibility(View.VISIBLE);
            addressFragment.et_title.setEnabled(false);
            addressFragment.et_address.setEnabled(false);

            try {
                addressFragment.et_title.setText(Addresses.getJSONObject(position).getString("Title"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            try {
                addressFragment.et_address.setText(Addresses.getJSONObject(position).getString("Address"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            addressFragment.status=1;
            try {
                addressFragment.profileID=Integer.parseInt(Addresses.getJSONObject(position).getString("ProfileAddressID"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            //TODO open edit dialog for Addresses.getJSONObject(position)
        }


    }
}


@Override
public boolean onBackPressed() {

    if(info_ll.getVisibility()==View.VISIBLE){
        fab.setVisibility(View.VISIBLE);
        recyclerView.setVisibility(View.VISIBLE);
        info_ll.setVisibility(View.GONE);
        return true;
    }else {
        return false;
    }
}

}

ProfileFragment

public class ProfileFragment extends BaseFragment {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";


private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;
Button btn_edit;
EditText et_name;
EditText et_phone;
EditText et_email;
ProgressDialog pDialog;
int pDilog_Counter=0;

public ProfileFragment() {
    // Required empty public constructor
}
public static ProfileFragment newInstance(String param1, String param2) {
    ProfileFragment fragment = new ProfileFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

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

    btn_edit=(Button) v.findViewById(R.id.btn_edit);
    et_name= (EditText)  v.findViewById(R.id.et_name);
    et_email= (EditText) v.findViewById(R.id.et_email);
    et_phone= (EditText) v.findViewById(R.id.et_phone);
    PAProfileInfo();
    btn_edit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            PAProfileEdit();
        }
    });
    ((ProfileActivity)getActivity()).setImage();
    return v;
}

public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}


@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}



public interface OnFragmentInteractionListener {
    void onFragmentInteraction(Uri uri);
}

private void PAProfileInfo() {
    String url="http://RO.nirasoftware.com:8888/WS/WSPAProfileInfo.aspx?"+
            "CustomerCode="+ DataContainer.getObject().getCustomerCode() +
            "&TokenID="+ DataContainer.getObject().getTokenID() +
            "&Type=JSON&VS="+DataContainer.getObject().getVersion();
    showProgress();
    StringRequest request = new StringRequest(Request.Method.GET,url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject NRS=(new JSONObject(response)).getJSONObject("NRS");

                        if(NRS.getJSONObject("Error").getInt("ErrCode")==0){
                            Toast.makeText(getActivity(),NRS.getJSONObject("Error").getString("ErrFa"), Toast.LENGTH_SHORT).show();

                            try {
                                et_name.setText(NRS.getJSONObject("Customer").getString("CustomerFullName"));
                                et_email.setText(NRS.getJSONObject("Customer").getString("EMail"));
                                et_phone.setText(NRS.getJSONObject("Customer").getString("MobileNo"));
                                ((ProfileActivity)getActivity()).setTv_name(NRS.getJSONObject("Customer").getString("CustomerFullName"));
                                ((ProfileActivity)getActivity()).setTv_email(NRS.getJSONObject("Customer").getString("EMail"));
                                ((ProfileActivity)getActivity()).setTv_phone(NRS.getJSONObject("Customer").getString("MobileNo"));
                            }catch (JSONException e){

                            }
                            hideProgress();
                        }else{
                            Toast.makeText(getActivity(),NRS.getJSONObject("Error").getString("ErrFa"), Toast.LENGTH_SHORT).show();
                            hideProgress();
                        }
                    } catch (JSONException e) {
                        Toast.makeText(getActivity(),"Error in json received", Toast.LENGTH_LONG).show();
                        hideProgress();

                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //VolleyLog.d(TAG, "Error: " + error.getMessage());
                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(),R.style.MyDialogTheme);

                    // 2. Chain together various setter methods to set the dialog characteristics
                    String s=error.getMessage();

                    if(error.networkResponse==null)
                        s="سرعت کم اتصال";
                    else
                        s+="\nResponse:\n\t"+error.networkResponse.toString();

                    builder.setMessage(s).setTitle("خطا:");

                    // 3. Get the AlertDialog from create()
                    AlertDialog dg = builder.create();
                    dg.setButton(AlertDialog.BUTTON_POSITIVE, "تلاش مجدد", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                            ProfileFragment.this.PAProfileInfo();
                        } });
                    dg.setButton(AlertDialog.BUTTON_NEGATIVE, "انصراف", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                            getActivity().finish();
                        } });

                    dg.show();
                    hideProgress();
                    //getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

                }
            });
    DataContainer.getObject().getRequestQueue().add(request);
}

private void PAProfileEdit() {
    String url="http://RO.nirasoftware.com:8888/WS/WSPAProfileEdit.aspx?"+
            "CustomerCode="+ DataContainer.getObject().getCustomerCode() +
            "&TokenID="+ DataContainer.getObject().getTokenID() +
            "&Type=JSON&VS="+DataContainer.getObject().getVersion()+
            "&FullName="+et_name.getText().toString()+
            "&Email=" + et_email.getText().toString()+
            "&Phone="+et_phone.getText().toString();
    showProgress();
    StringRequest request = new StringRequest(Request.Method.GET,url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject NRS=(new JSONObject(response)).getJSONObject("NRS");

                        if(NRS.getJSONObject("Error").getInt("ErrCode")==0){
                            Toast.makeText(getActivity(),NRS.getJSONObject("Error").getString("ErrFa"), Toast.LENGTH_SHORT).show();
                            ((ProfileActivity)getActivity()).setTv_name(et_name.getText().toString());
                            DataContainer.getObject().setName(et_name.getText().toString());
                            ((ProfileActivity)getActivity()).setTv_email(et_email.getText().toString());
                            DataContainer.getObject().setEMail(et_email.getText().toString());
                            ((ProfileActivity)getActivity()).setTv_phone(et_phone.getText().toString());
                            DataContainer.getObject().setPhoneNo(et_phone.getText().toString());

                            hideProgress();
                        }else{
                            Toast.makeText(getActivity(),NRS.getJSONObject("Error").getString("ErrFa"), Toast.LENGTH_SHORT).show();
                            hideProgress();
                        }
                    } catch (JSONException e) {
                        Toast.makeText(getActivity(),"Error in json received", Toast.LENGTH_LONG).show();
                        hideProgress();

                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //VolleyLog.d(TAG, "Error: " + error.getMessage());
                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(),R.style.MyDialogTheme);

                    // 2. Chain together various setter methods to set the dialog characteristics
                    String s=error.getMessage();

                  /*  if(error.networkResponse!=null)
                    //TODO #$# s+="\nResponse:\n\t"+error.networkResponse.toString();
                    else*/

                    s="سرعت کم اتصال";
                    builder.setMessage(s).setTitle("خطا:");

                    // 3. Get the AlertDialog from create()
                    AlertDialog dg = builder.create();
                    dg.setButton(AlertDialog.BUTTON_POSITIVE, "تلاش مجدد", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                            PAProfileEdit();
                        } });
                    dg.show();
                    hideProgress();
                    //getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

                }
            });
    DataContainer.getObject().getRequestQueue().add(request);
}

private void showProgress() {
    pDilog_Counter++;
    if(pDilog_Counter>1)
        return;
    pDialog = new ProgressDialog(getActivity(),R.style.AppCompatAlertDialogStyle);
    pDialog.setMessage("لطفا منتظر بمانید....");
    pDialog.show();
    getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}

private void hideProgress() {
    pDilog_Counter--;
    if(pDilog_Counter>0)
        return;
    pDialog.hide();
    pDialog.dismiss();
    getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}

@Override
public boolean onBackPressed() {
    return false;
}

}

BaseFragment

public abstract class BaseFragment extends Fragment {

public abstract boolean  onBackPressed();

    }

您必須給每個片段一個唯一的TAG,這將幫助您輕松檢索

getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.container, new PlaceholderFragment(), "First Fragment")
            .commit();

檢索(例如向后按下)

Fragment fragment = getSupportFragmentManager().findFragmentByTag("FirstFragment");
    if (fragment == null) {
        fragment = new PlaceholderFragment();
    }
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.container, fragment, "FirstFragment")
            .commit();

最終我找到了解決方案,我找到了當前片段的標簽,該標簽顯示在viepager中並比較了AddressFragment類

 @Override
public void onBackPressed() {

    BaseFragment fragment =
            (BaseFragment) getSupportFragmentManager().findFragmentByTag(
                   "android:switcher:"+R.id.viewpager+":"+viewPager.getCurrentItem());

    if(fragment instanceof AddressFragment)  // could be null if not instantiated yet
    {
        if(!fragment.onBackPressed())
            super.onBackPressed();
    }else
        super.onBackPressed();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM