私は2つのクラスを持っています。1 つ目はアクティビティ、2 つ目は一部のEditText
. アクティビティでは async-task を持つサブクラスがあり、メソッドdoInBackground
では結果を取得して変数に保存します。この変数をサブクラス「my activity」からこのフラグメントに送信するにはどうすればよいですか?
22 に答える
Activity から、次のような意図でデータを送信します。
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
フラグメントの onCreateView メソッドでは:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String strtext = getArguments().getString("edttext");
return inflater.inflate(R.layout.fragment, container, false);
}
この答えは遅すぎるかもしれません。しかし、それは将来の読者にとって役立つでしょう。
私にはいくつかの基準があります。意図からファイルを選択するようにコーディングしました。選択されたファイルは、さらに処理するために特定のフラグメントに渡されます。ファイルピッキングの機能を持つ多くのフラグメントがあります。当時、毎回条件をチェックしてフラグメントを取得し、値を渡すのはかなり嫌です。そのため、インターフェイスを使用して値を渡すことにしました。
ステップ 1:メイン アクティビティでインターフェイスを作成します。
public interface SelectedBundle {
void onBundleSelect(Bundle bundle);
}
ステップ 2:同じアクティビティで SelectedBundle 参照を作成する
SelectedBundle selectedBundle;
ステップ 3:同じアクティビティでメソッドを作成する
public void setOnBundleSelected(SelectedBundle selectedBundle) {
this.selectedBundle = selectedBundle;
}
ステップ 4: SelectedBundle 参照を初期化する必要があります。これはすべてのフラグメントでファイルピッカー機能が必要です。このコードをフラグメントonCreateView(..)
メソッドに配置します。
((MainActivity)getActivity()).setOnBundleSelected(new MainActivity.SelectedBundle() {
@Override
public void onBundleSelect(Bundle bundle) {
updateList(bundle);
}
});
ステップ 5:私の場合、イメージ Uri を HomeActivity からフラグメントに渡す必要があります。だから、私は onActivityResult メソッドでこの機能を使用しました。
MainActivity からの onActivityResult は、インターフェイスを使用して値をフラグメントに渡します。
注: ケースは異なる場合があります。HomeActivity のどこからでも呼び出すことができます。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
selectedBundle.onBundleSelect(bundle);
}
それで全部です。FragmentClass で必要なすべてのフラグメントを実装します。あなたは素晴らしいです。あなたはやった。おお...
最適で便利な方法は、フラグメント インスタンスを呼び出し、その時点でデータを送信することです。 デフォルトではすべてのフラグメントにインスタンスメソッドがあります
例: フラグメント名がMyFragmentの場合
したがって、次のようにアクティビティからフラグメントを呼び出します。
getSupportFragmentManager().beginTransaction().add(R.id.container, MyFragment.newInstance("data1","data2"),"MyFragment").commit();
*R.id.container は私の FrameLayout の ID です
したがって、MyFragment.newInstance("data1","data2") ではデータをフラグメントに送信でき、フラグメントではMyFragment newInstance(String param1, String param2)でこのデータを取得できます
public static MyFragment newInstance(String param1, String param2) {
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
次に、フラグメントのonCreateメソッドでデータを取得します。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
したがって、mParam1 には data1 があり、mParam2 には data2 があります
このmParam1とmParam2をフラグメントで使用できるようになりまし た。
フラグメント (F) を使用する基本的な考え方は、Android アプリケーションで再利用可能な自己維持 UI コンポーネントを作成することです。これらのフラグメントはアクティビティに含まれており、A -> F および FA から通信経路を作成する一般的な (最良の) 方法があります。アクティビティを介して FF 間で通信する必要があります。これは、フラグメントのみが分離され、自立するためです。
したがって、A -> F からのデータの受け渡しは、ρяσσρєя K で説明されているのと同じになります。その答えに加えて、アクティビティ内でフラグメントを作成した後、フラグメント内のメソッドを呼び出すフラグメントにデータを渡すこともできます。
例えば:
ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
articleFrag.updateArticleView(position);
フラグメント (の具体的なサブクラス) への参照を非同期タスクに渡すと、フラグメントに直接アクセスできます。
フラグメント参照を非同期タスクに渡すいくつかの方法:
- 非同期タスクが完全なクラス (
class FooTask extends AsyncTask
) である場合は、フラグメントをコンストラクターに渡します。 - 非同期タスクが内部クラスの場合は、非同期タスクが定義されているスコープ内で、または外部クラスのフィールドとして、最終的な Fragment 変数を宣言するだけです。内部クラスからアクセスできます。
フラグメントに public static メソッドを作成して、そのフラグメントの静的参照を取得し、その関数にデータを渡し、そのデータを同じメソッドの引数に設定し、フラグメントの oncreate メソッドで getArgument を介してデータを取得し、そのデータをローカルに設定できます。変数。
最新のナビゲーション アーキテクチャ コンポーネントを使用しているときに、同様の問題に遭遇しました。呼び出しアクティビティからフラグメントにバンドルを渡して、上記のすべてのコードを試しました。
Android の最新の開発トレンドに従う最適なソリューションは、View Model (Android Jetpack の一部) を使用することです。
親アクティビティで ViewModel クラスを作成して初期化します。この ViewModel は、アクティビティとフラグメントの間で共有する必要があることに注意してください。
次に、フラグメントの onViewCreated() 内で、同じ ViewModel を初期化し、ViewModel フィールドをリッスンするように Observers をセットアップします。
必要に応じて、ここに役立つ詳細なチュートリアルがあります。
私の解決策は、フラグメント内に静的メソッドを記述することです。
public TheFragment setData(TheData data) {
TheFragment tf = new TheFragment();
tf.data = data;
return tf;
}
このようにして、必要なすべてのデータが、フラグメントを操作する必要がある可能性のある他の操作の前に、フラグメント内にあると確信しています。また、私の意見ではよりきれいに見えます。
フラグメントとアクティビティ間でデータを渡す最も賢明な試行錯誤済みの方法は、変数を作成することです。例:
class StorageUtil {
public static ArrayList<Employee> employees;
}
次に、フラグメントからアクティビティにデータを渡すには、onActivityCreated メソッドで行います。
//a field created in the sending fragment
ArrayList<Employee> employees;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
employees=new ArrayList();
//java 7 and above syntax for arraylist else use employees=new ArrayList<Employee>() for java 6 and below
//Adding first employee
Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian");
employees.add(employee);
//Adding second employee
Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian");
employees.add(employee);
StorageUtil.employees=employees;
}
StorageUtil.employees の値をどこからでも取得できるようになりました。幸運を!
コトリンのバージョン:
でActivity
:
val bundle = Bundle()
bundle.putBoolean("YourKey1", true)
bundle.putString("YourKey2", "YourString")
val fragment = YourFragment()
fragment.arguments = bundle
val fragmentTransaction = parentFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.your_container, fragment, fragment.toString())
fragmentTransaction.commit()
Fragment
onCreate()で:
var value1 = arguments?.getBoolean("YourKey1", default true/false)
var value2 = arguments?.getString("YourKey2", "Default String")