4

FragmentActivityを拡張するクラスを持つアプリに取り組んでいます。onResume()メソッドでは、このfragmentactivityの参照を送信するクラスを呼び出していました。そのクラスでは、別のフラグメントに置き換えています。

そのフラグメントでは、レイアウトを動的に追加していますが、ボタンをクリックすると、startActivityForResult()を呼び出して、EditTextのテキストを更新しようとしているOnActivityResult()の結果を受け取りますが、起きていません。戻るボタンをクリックすると、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>
4

1 に答える 1

2

...しかし、ボタンをクリックすると、startActivityForResult()を呼び出して、EditTextのテキストを更新しようとしているOnActivityResult()の結果を受け取りますが、それは発生していません。戻るボタンをクリックすると、EditTextのテキストが変更されているのを見ることができます

LoadScreenHelperこれは、のonResumeメソッドでの使用が原因で発生していると思いますFragmentActivityonResumeアクティビティが前に出たときに常に呼び出されることを覚えておいてください。これは、Activity開始startActivityForResultが戻った後にも発生します。LoadScreenHelperこれで、のメソッドを呼び出すことにより、常にイニシャルloadTargetScreen()に新しいものを追加します。子から戻ると、メソッドが再度呼び出され、最初に追加されたフラグメントをカバーする新しいものが作成される可能性があります。戻るボタンをクリックすると、この一番上のフラグメントが画面から削除され、最初に追加されたフラグメントが残ります。MultiFormScreenFragmentFragmentActivityActivityonResumeMultiFormScreenFragment

LoadScreenHelperクラスで最後に何をしようとしているのかわからないので、次のいずれかの行を移動することをお勧めします。

new LoadScreenHelper((FragmentActivity)context, R.id.fragment_container).loadTargetScreen("", 1,"",1,false,"","","");

メソッド内でonCreate1回だけ実行されるようにするか、メソッドにチェックを挿入してloadTargetScreen、のインスタンスMultiFormScreenFragmentがまだレイアウトにないかどうかを確認します(FragmentManagerフラグメントを見つけるにはを使用します)。すでにレイアウトに含まれている場合は、フラグメントの新しいインスタンスを追加する以外に何もしません。

于 2012-12-18T20:27:56.903 に答える