2017-03-17 86 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()中。