2017-03-17 92 views
0

如何实现此目的?当对话框片段被解除时刷新其他活动的片段

好吧,我有这个过程 在索引活动,当我点击侧导航配置文件,它会调用片段(配置文件)通片段交易现在

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 Page

当我点击“申请开发”按钮,它会调用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."); 

现在,这是我的对话片段代码:

@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; 
} 

现在我的问题是,当我按下对话框片段上的按钮时,它应该刷新我的配置文件片段。如何实现这一目标?我试图分离附加,但我的应用程序只是坠毁和空例外。

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; 
} 

}

+0

如果用户没有立即回到配置文件片段会发生什么?例如,如果用户退出应用并在一周后再次启动该应用,该配置是否应该永久更新?如果是这样,这表明使用某种永久存储来在对话框和片段之间“进行通信”。 –

+0

其实我在这里改变的是按钮文本,但它基于我的数据库,所以它即使在注册后也会改变,我将关闭应用程序,下一次我再次打开应用程序时,用户将无法再访问开发者注册,我唯一的问题是,当我注册,然后我关闭对话框片段,配置文件页面不刷新,除非我关闭配置文件片段,然后我再次打开它。 –

+0

什么方法“片段刷新”?这一切都在'onCreateView()'?这听起来像你需要找到正确的生命周期回调方法来用于“刷新”片段。仔细查看片段生命周期以帮助您了解这一点。如果你确实在'onCreateView()'中做了所有事情,你可能需要将“refresh”逻辑移到'onResume()'。 –

回答

0

I'dd建议你使用活动电话之间的意图,并StartForRsults()。

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

然后,设置一个全局变量“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. 
        */ 
       } 
      }); 

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

+0

感谢您的支持。但我有一个问题,问题是当我使用FragmentTransaction刷新我的片段时,它返回一个错误; java.lang.NullPointerException:尝试从空字段'int android.support.v4.app.Fragment.mContainerId'读取null对象引用 你能帮助我如何正确地刷新我的片段吗?我应该使用片段交易吗? –

+0

你不需要fragmentTransaction来做到这一点。我几乎可以肯定,这不甚有效。在片段中实现刷新方法(更新视图和全部)并通过您的活动调用该方法。所以如果你想从你的对话框中刷新,调用顺序是对话框 - >刷新(活动) - >刷新(配置文件),因为你的片段没有彼此链接。 – Feuby

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

  2. 当你想刷新片段(在你的情况下,当点击对话框片段上的按钮时)发送一个broadcast,它将被你的广播接收器捕获到配置文件片段上。

这也将确保解决方案不太紧密耦合。

0

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