2

我正在開發一個應用程序,其中有一個擴展FragmentActivity的類。 在onResume()方法中,我調用了一個我正在發送這個片段活動的引用的類,並且在那個類中我將其替換爲另一個片段。無法從onActivityResult更新Fragment UI

在該片段中,我動態地添加了佈局,但是當我點擊按鈕時,我調用startActivityForResult(),然後在OnActivityResult()中接收結果,我試圖更新EditText ,但它沒有發生。當我點擊返回按鈕時,我可以看到EditText上的文字已更改。任何人都可以幫助我解決這個問題。我會在這裏發佈我的整個源代碼。

MainActivity.java

public class MainActivity extends FragmentActivity { 

//FragmentActivity context; 
Context context; 
FragmentManager fm; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    context = MainActivity.this; 

    /* fm = getSupportFragmentManager(); 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment multiFormScreenFragment = MultiFormScreenFragment.newInstance(1); 
    fm.beginTransaction() 
    .replace(R.id.fragment_container, multiFormScreenFragment) 
    .commit(); 
*/ 
    } 


@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    new LoadScreenHelper((FragmentActivity)context,    R.id.fragment_container).loadTargetScreen("", 1,"",1,false,"","",""); 
} 



     } 

LoadScreenHelper.java

package com.cognizant.aim.LoadScreen; 

import com.android.testfragmentactivityresult.MultiFormScreenFragment; 

    public class LoadScreenHelper { 

public FragmentActivity context; 
//public Context context; 
int mContainerId=-1; 
public LoadScreenHelper(FragmentActivity c,int containerId){ 

    context = c; 
    mContainerId = containerId ; 
} 




public void loadTargetScreen(String screenType,int nav_id,String usid,int screenorder, boolean isMain,String filterColumnName,String filterColumnVal,String uiHeadingTitle){//uiHeadingTitle 

    System.out.println("ScreenType::::"+screenType+"nav_id"+nav_id+":::"+"screenorder::::"+screenorder); 



    Bundle bundle = new Bundle(); 
    bundle.putInt("screenOrder", 1); 
    bundle.putString("uniqueid", "1"); 
    bundle.putString("title", "Form"); 
    // bundle.putString("tableName", dataSourceTableName); 
    // bundle.putString("rowId", clicked_list_row_Id); 

    FragmentManager fm = context.getSupportFragmentManager(); 
    Fragment multiFormScreenFragment = MultiFormScreenFragment.newInstance(1 /*screenId*/); 
    multiFormScreenFragment.setArguments(bundle); 
    if(isMain){ 
     fm.beginTransaction() 
     .replace(mContainerId, multiFormScreenFragment) 
     .commit(); 
    } 
    else{ 
     fm.beginTransaction() 
     .replace(mContainerId, multiFormScreenFragment) 
     .addToBackStack("null") 
     .commit(); 

    } 

} 

     } 

MultiFormScreenFragment.java

 public class MultiFormScreenFragment extends Fragment { 
    View view; 
int mContainerId = -1; 
private static final String TAG = "MultiFormScreenFragment"; 
LinearLayout llayout; 
public static MultiFormScreenFragment newInstance(int parentid) { 
    MultiFormScreenFragment f = new MultiFormScreenFragment(); 
    Bundle b = new Bundle(); 
    b.putInt("list_id", parentid); 
    f.setArguments(b); 
    return f; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 


} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    mContainerId = container.getId(); 
    view = inflater.inflate(R.layout.activity_main, container, false); 
    llayout = (LinearLayout)view.findViewById(R.id.llayout); 
    generateUILayout(); 

    return view; 
} 

private void generateUILayout() { 
    // TODO Auto-generated method stub 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
    Button newBtn = new Button(getActivity()); 
    newBtn.setLayoutParams(params); 
    newBtn.setId(1); 
    newBtn.setText("Demo"); 
    llayout.addView(newBtn); 

    EditText newEText = new EditText(getActivity()); 
    newBtn.setLayoutParams(params); 
    newEText.setId(2); 
    newEText.setText("Demo"); 

    llayout.addView(newEText); 

    newBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Intent intent = new Intent(getActivity(), SecondActivity.class); 
      intent.putExtra("sampleData", "This is Sample Data"); 
      startActivityForResult(intent, 1); 

     } 
    }); 


} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode==getActivity().RESULT_OK && requestCode==1){ 
     String msg = data.getStringExtra("returnedData"); 
     EditText eText = (EditText)getActivity().findViewById(2); 
     eText.setText(msg); 
    } 
} 



     } 


    SecondActivity.java 
    =================== 

    package com.android.testfragmentactivityresult; 

    import android.app.Activity; 
     import android.content.Intent; 
    import android.os.Bundle; 


     public class SecondActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
     Intent intent= getIntent(); 
     String msg = intent.getStringExtra("sampleData"); 
     msg += ", Added at Third"; 
     intent.putExtra("returnedData", msg); 
     setResult(RESULT_OK, intent); 
     finish(); 
} 
    } 


activity_main.xml 
================== 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:id="@+id/llayout"> 

    </LinearLayout> 


     main.xml 
     ======== 
     <?xml version="1.0" encoding="utf-8"?> 
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <FrameLayout 
      android:id="@+id/fragment_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
     android:layout_weight="1" /> 

     </LinearLayout> 


     AndroidManifest.xml 
     =================== 
      <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.android.testfragmentactivityresult" 
      android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="15" /> 

    <application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity 
     android:name = ".SecondActivity" 
     ></activity> 
    </application> 

    </manifest> 

回答

2

...但是當我點擊我打電話startActivityForResult() 該消息又在OnActivityResult(),其中我 嘗試更新的EditText文本接收結果的按鈕,但情況並非如此。當 我點擊後退按鈕,我能夠看到的EditText文本改變

我想這是因爲在FragmentActivityonResume方法使用LoadScreenHelper的發生。請記住,onResume將始終被稱爲當活動來臨前,這也會發生Activity開始startActivityForResult將返回。現在,通過調用LoadScreenHelperloadTargetScreen()方法,您將始終將新的MultiFormScreenFragment添加到最初的FragmentActivity。當您從孩子Activity回來時,將再次調用onResume方法,並且將最有可能創建新的MultiFormScreenFragment覆蓋最初添加的片段。如果您點擊後退按鈕,該頂部片段將從屏幕上移除,留下最初添加的片段。

由於我不知道你想到底做的LoadScreenHelper類我建議要麼招行是什麼:所以它是隻執行一次

​​

onCreate方法,或在loadTargetScreen方法中插入支票以確定MultiFormScreenFragment的實例是否不在佈局中(使用FragmentManager來查找片段)。如果它已經在佈局中,則不要執行其他任何操作,否則添加片段的新實例。

+0

非常感謝。我從onResume()移動到了onCreate()這一問題,解決了我的問題。再次感謝 –