当Dialog片段被解除时,从其他活动刷新片段

时间:2017-03-17 22:25:31

标签: android android-fragments

如何实现这一目标?

好的,我有这个过程 在Index Activity上,当我单击侧面导航配置文件时,它将通过片段事务

调用Fragment(Profile)
  if (id == R.id.nav_profile){
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        transaction.setCustomAnimations(R.anim.enter,R.anim.exit,R.anim.enter,R.anim.exit);
        transaction.replace(R.id.flContent, new Profile(), "ProfileFragment");
        transaction.addToBackStack(null);
        viewPager.getAdapter().notifyDataSetChanged();
        transaction.commit();
    }

现在我在Profile Fragment上:

Profile Page

当我点击“申请开发者”按钮时,它将通过Intent调用DevRegistration活动

  case 1:
                    btnBeDeveloper.setText("Apply for Developer");
                    btnBeDeveloper.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent index = new Intent(getActivity(), DevRegistration.class);
                            startActivity(index);
                        }
                    });
                    break;

第3步:
单击“注册”后,在DevRegistration上,将显示一个对话框片段

 FragmentManager fm = getSupportFragmentManager();
            df_SuccessDevRegistration dialogFragment = new df_SuccessDevRegistration();
            dialogFragment.show(fm, "Dev Register.");

现在这是我的Dialog Fragment代码:

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    View rootView = inflater.inflate(R.layout.fragment_success_developer_registration, container, false);

    btnDevGoProfile = (Button) rootView.findViewById(R.id.btnDevGoProfile);

    btnDevGoProfile.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dismiss();
            getActivity().finish();
        }
    });

    return rootView;
}

现在问题是,当我按下对话框片段上的按钮时,它应该刷新我的个人资料片段。怎么实现呢?我尝试分离附加,但我的应用程序崩溃,并为null异常。

public class Profile extends Fragment {


TextView txvStudID, txvStudUsername, txvStudEmail, txvStudBday,txvProfileName;
CollapsingToolbarLayout ctlName;
ImageView imvProfilePic;
Button btnBeDeveloper;
View rootView;
String picURL;
FragmentTransaction ft;  Fragment currentFragment;
/** Recycler View**/

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    rootView = inflater.inflate(R.layout.activity_profile, container, false);
    Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.profile_toolbar);
    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);

    toolbar.setNavigationOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view) {
            NavigationView navigationView = (NavigationView) getActivity().findViewById(R.id.nav_view);
            getFragmentManager().popBackStack();
            navigationView.getMenu().getItem(0).setChecked(true);
    }
    });

    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(true);

    txvStudID = (TextView) rootView.findViewById(R.id.txvStudID);
    txvStudUsername = (TextView) rootView.findViewById(R.id.txvStudUsername);
    txvStudEmail = (TextView)rootView.findViewById(R.id.txvStudEmail);
    txvStudBday = (TextView) rootView.findViewById(R.id.txvStudBday);
    txvProfileName = (TextView) rootView.findViewById(R.id.txvProfileName);
    ctlName = (CollapsingToolbarLayout) rootView.findViewById(R.id.ctlName);
    imvProfilePic = (ImageView) rootView.findViewById(R.id.imvProfilePic);
    btnBeDeveloper = (Button) rootView.findViewById(R.id.btnBeDeveloper);

    checkLevelOfAccess();

    /** get user's data **/
    getCurrentUserData(DataClass.currentEnteredUsername);

    return rootView;
}

public void checkLevelOfAccess()
{
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    String acctID = preferences.getString("acctID", "DEFAULT");

    switch (checkLevelOfAccess(acctID)) {


        // if the level of access is developer
        case 1:
            btnBeDeveloper.setText("Developer Console");
            btnBeDeveloper.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent index = new Intent(getActivity(), UploadApp.class);
                    startActivity(index);
                }
            });
            break;


        // else if the level of access is not a developer
        case 0:

            switch (checkIfRegistered(acctID))
            {
                //already apply
                case 0:
                    btnBeDeveloper.setText("Cancel Developer Request");
                    break;

                case 1:
                    btnBeDeveloper.setText("Apply for Developer");
                    btnBeDeveloper.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent index = new Intent(getActivity(), DevRegistration.class);
                            startActivityForResult(index, 10001);
                        }
                    });
                    break;


            }

    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if ((requestCode == 10001) && (resultCode == Activity.RESULT_OK))
    {
        System.out.println("IM HERE NA!!!");
        checkLevelOfAccess();
    }

}

public void getCurrentUserData(String currentUser) {

    try {
        String accountURL = DataClass.localAddress + "android_php/account.php";
        URL url = new URL(accountURL);
        connection = (HttpURLConnection) url.openConnection();
        connection.connect();
        InputStream stream = connection.getInputStream();
        reader = new BufferedReader(new InputStreamReader(stream));
        StringBuffer buffer = new StringBuffer();
        String line = "";

        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

        String finalJson = buffer.toString();

        JSONObject parentObject = new JSONObject(finalJson);
        JSONArray parentArray = parentObject.getJSONArray("users");

        for (int x = 0; x < parentArray.length(); x++) {
            JSONObject finalObject = parentArray.getJSONObject(x);

            if (finalObject.getString("username").equalsIgnoreCase(currentUser) || finalObject.getString("studID").equalsIgnoreCase(currentUser)
                    || finalObject.getString("email").equalsIgnoreCase(currentUser)) {


                txvStudID.setText(finalObject.getString("studID"));
                txvStudUsername.setText(finalObject.getString("username"));
                txvStudEmail.setText(finalObject.getString("email"));
                txvStudBday.setText(convertDate(finalObject.getString("bday")));
                ctlName.setTitle(finalObject.getString("name"));
                txvProfileName.setText(finalObject.getString("name"));

                //set Profile Picture
                picURL =   DataClass.localAddress + finalObject.getString("pic");
                LoadImageFromURL loadImage = new LoadImageFromURL();
                loadImage.execute();
            }

        }
    } catch (Exception e) {
        e.printStackTrace();
    }



}

public String convertDate(String date) throws ParseException {
    String strCurrentDate = date;
    DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
    DateFormat outputFormat = new SimpleDateFormat("dd MMM yyyy");

    Date parseDate = inputFormat.parse(strCurrentDate);
    String converted = outputFormat.format(parseDate);
    return converted;
}

public class LoadImageFromURL extends AsyncTask<String, Void, Bitmap>{

    @Override
    protected Bitmap doInBackground(String... params) {
        // TODO Auto-generated method stub

        try {
            InputStream is = new URL(picURL).openConnection().getInputStream();
            Bitmap bitMap = BitmapFactory.decodeStream(is);
            GetCircleBitmap gcb = new GetCircleBitmap();
            Bitmap b = gcb.GetCircleBitmap(bitMap);
            return b;

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;

    }

    @Override
    protected void onPostExecute(Bitmap result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        imvProfilePic.setImageBitmap(result);
    }

}


public int checkLevelOfAccess(String data)
{
    try {
        String accountURL =  DataClass.localAddress + "android_php/account.php";
        URL url = new URL(accountURL);
        connection = (HttpURLConnection) url.openConnection();
        connection.connect();
        InputStream stream = connection.getInputStream();
        reader = new BufferedReader(new InputStreamReader(stream));
        StringBuffer buffer = new StringBuffer();
        String line = "";


        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

        String finalJson = buffer.toString();

        JSONObject parentObject = new JSONObject(finalJson);
        JSONArray parentArray = parentObject.getJSONArray("users");

        for (int x = 0; x < parentArray.length(); x++) {
            JSONObject finalObject = parentArray.getJSONObject(x);

            // true
            if (finalObject.getString("acctid").equalsIgnoreCase(data) && finalObject.getString("acctlofa").equals("1"))
            {
                return 1;
            }
            else if (finalObject.getString("acctid").equalsIgnoreCase(data) && finalObject.getString("acctlofa").equals("0"))
            {
                return 0;
            }


        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return 2;
}

/** Check if the user already applied to become a developer **/
public int checkIfRegistered(String data) {
    try {
        String accountURL =  DataClass.localAddress + "android_php/developer_account.php";
        URL url = new URL(accountURL);
        connection = (HttpURLConnection) url.openConnection();
        connection.connect();
        InputStream stream = connection.getInputStream();
        reader = new BufferedReader(new InputStreamReader(stream));
        StringBuffer buffer = new StringBuffer();
        String line = "";


        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

        String finalJson = buffer.toString();

        JSONObject parentObject = new JSONObject(finalJson);
        JSONArray parentArray = parentObject.getJSONArray("users");

        for (int x = 0; x < parentArray.length(); x++) {
            JSONObject finalObject = parentArray.getJSONObject(x);

            // pending application
            if (finalObject.getString("acctID").equalsIgnoreCase(data) && finalObject.getString("devStatus").equals("0"))
            {
                return 0;
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return 1;
}

}

3 个答案:

答案 0 :(得分:0)

我建议你在activity call和StartForRsults()之间使用意图。

然后,当您使用public void onActivityResult(int requestCode, int resultCode, Intent intent)恢复活动时,您将能够通过意图中的布尔检查用户是否正确注册(并且未取消注册)。

然后,设置一个全局变量“refreshProfile”,当您的活动以正确的意图表示用户注册时,将其设置为true。覆盖public void onPostResume(),使用if语句检查是否需要刷新配置文件。如果是,请执行此操作,然后将变量设为false。如果没有,什么都不做。

这样做会阻止您在恢复活动时更新profileFragment,因为有时会导致某些崩溃(“IllegalStateException:在onSaveInstanceState之后无法执行此操作”),因为您正在错误的时刻更新UI。

其他选项包括更改dialogFragment,设置自定义功能以刷新您的活动。

build.setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    /*refresh profile here
                     with instruction like getActivity().refresh();
                     where refresh is your activity public function to refresh profile.
                     */
                }
            });

但是,我不喜欢这种方式,因为您的个人资料会在更新之前等待用户确认。我发现更新配置文件更清晰,更优雅然后防止用户一切顺利。但是这里有个人意见。

答案 1 :(得分:0)

  1. 在您需要刷新的片段中创建并注册broadcast receiver

  2. 当您想要刷新片段时(在您点击对话框片段上的按钮的情况下)发送broadcast,您的广播接收器会在配置文件片段中捕获该片段。

  3. 这也将确保解决方案不会过于紧密耦合。

答案 2 :(得分:0)

您需要将结果返回到包含配置文件数据的活动。这可以通过几种方式完成。在这种情况下,我假设您希望配置文件永久保持更改。例如,如果用户退出应用程序并在一周后再次启动,则更改应保留在配置文件屏幕上。这表明您需要永久存储数据。对于少量数据,例如布尔标志或字符串,您可以使用SharedPreferences。对于更复杂的数据,请使用SQLite数据库或平面文件。现在,对话框只将数据保存到所选介质,配置文件片段将数据加载到onCreate()