1

これは前の質問からの一種の拡張ですが、より多くの質問とより少ないコード ( Android が別のアクティビティを開始するか、別のクラスからメソッドを呼び出す (フラグメントを使用) )。ロケーション API コードと組み合わせたナビゲーション ドロワーのサンプル アプリを作成しながら、フラグメントとアクティビティが Android アプリ内でどのように機能するかをよりよく理解しようとしています。

私が理解しているように、UI コンポーネントを適切に実行するには、Activity を拡張するナビゲーション ドロワーを作成する必要があります。これまでに行ったことは、UI ペインを、それぞれに異なる XML ファイルと Java ファイルを持つさまざまなフラグメントに分割することでした。Java ファイルは、指定された XML から UI を構築し、次のようにナビゲーション ドロワーをそのまま維持しながら、コンテンツ ペインにコンテンツを表示します 。 using-fragments/ .

「ホーム」を除くこれらの各フラグメントには、この MainActivity: https://developer.android.com/training/location/retrieve-current.htmlに基づく Location APIs/Location アクティビティからのコードが必要です 。ただし、次の 2 つの問題があります。

  1. 私の Location Activity クラスには、UI から TextView 変数を設定するコード onCreate があります。しかし、UI はすべてフラグメントによって処理されます。そのため、ロケーション アクティビティが作成されるたびに、アクティビティがフラグメント UI と通信していないように見えるため、これらの変数は null になります。

  2. フラグメント内のボタンは、ロケーション アクティビティにのみ存在するメソッドを呼び出します。そして、それらはアクティビティと通信していないようで、フラグメントの Java クラスだけです。

まず、これはこれを行う適切な方法のように聞こえますか? フラグメントを使用してナビゲーション ドロワーのオプションを処理し、コンテンツ ペインでコンテンツを生成しますか? その場合、ロケーション アクティビティと連携させるにはどうすればよいですか?

4

1 に答える 1

1

私はあなたがここで言っていることに多くの面で遭遇しました、そして私はここに正しいことも間違っていることもないと思います.

  1. 答え: はい、その通りです。ここにはある種の「卵と鶏肉」の状況があるので、それを解決する方法は次のとおりです。

を。フラグメントの膨張が完了するまでユーザーに何もさせたくないので、最初のアクションは (ui/ux) 進行状況ダイアログを表示することです。

b. 念のためだけに、ある種のレイアウト(相対レイアウトとしましょう)内にフラグメントを追加するか、すでに追加していると仮定します..このレイアウトは独自のクラスに拡張できます: http ://developer.android.com/training/を参照してくださいcustom-views/create-view.html

今、あなたの特別なクラスでは、(あなたが入りたい瞬間に応じて)2つのうちの1つを使用することができます。} または - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); (onMeasure は最初だけでなく、何度も呼び出される可能性があることに注意してください。)

そのため、拡張されているビューがあり、アクティビティが作成されて膨張する前であっても、アクティビティの onCreate で grep できます。この拡張ビューでは、次のようなパブリック関数を追加します。

public void setOnFinishInflatingTheChikenOrTheEggListener(IonFinished listenr)...

IonFinished は、単純な関数を備えた単純なインターフェイスであり、ビューが画面上で膨張を終了したことを通知するだけです。

c. アクティビティに IonFinished を実装させ、setOnFinishInflatingTheChikenOrTheEggListener 関数にパラメーターとして渡し、そこに保存します。前にオーバーライドした関数の 1 つが呼び出されたときに、このリスナーをトリガーできます。

d. この関数はあなたのアクティビティでトリガーされています。ここでは、フラグメント化して彼と何かをしても安全です..すべてのビューが適切に配置されていると確信しているためです...(この時点でダイアログを閉じることを忘れないでください).

(わからない場合は、例を挙げて教えてください...)

2. 回答: 2 番目の問題に進みましょう。これは以前よりもはるかに簡単です。フラグメントにはボタンがあり、それらに onClickListner を設定します...その中で次を使用する必要があります。

Activity activity =  getActivity();
if(activity!=null && activity instanceof LocationActivity ){
LocationActivity myLocationActivity = (LocationActivity)activity;
//****************************************************************
// call here to any public function in your activity, get set listeners, basically do anything.. 
}

フラグメントについてもっと理解するのに役立つことを願っています...

于 2013-07-07T03:18:17.947 に答える