アプリケーションの構築を開始しましたが、メイン構造で何か間違ったことをしている可能性があります。私のアプリケーションは、互いに通信する 3 つのフラグメントです。最初のフラグメントは設定に関するもので、2 番目のフラグメントは拡張可能な配列リストです。3 つ目は Gmap です。
最初のフラグメント (つまり場所) の特定の設定をクリックすると、gmap が適切な場所で開きます... 2 番目のフラグメントの子項目についても同じです。また、すべてのフラグメントの現在の場所を更新するスレッドが必要です。
これは、アプリをどのように構成すればよいかわかりません。フラグメントは 3 つでもいいのですが、アクティビティを 3 つ使用する必要がありますか? また、フラグメント内でのコミュニケーションはどのように行うべきでしょうか? フラグメントは直接通信してはならないことを読みましたが、私の場合、拡張可能な配列リストの子が GMap を含むフラグメントを直接開くことができない方法がわかりません...
私のアプリがどのように見えるかを理解するためだけに、ここに写真があります:
http://s14.postimg.org/ywj7yu8qp/Untitled.png
これまでのコードは次のとおりです。
主な活動:
package com.stylingandroid.basicactionbar;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity
{
private class MyTabListener implements ActionBar.TabListener
{
private Fragment mFragment;
private final Activity mActivity;
private final String mFragName;
public MyTabListener( Activity activity, String fragName )
{
mActivity = activity;
mFragName = fragName;
}
@Override
public void onTabReselected( Tab tab, FragmentTransaction ft )
{
// TODO Auto-generated method stub
}
@Override
public void onTabSelected( Tab tab, FragmentTransaction ft )
{
mFragment = Fragment.instantiate( mActivity, mFragName );
ft.add( android.R.id.content, mFragment );
}
@Override
public void onTabUnselected( Tab tab, FragmentTransaction ft )
{
ft.remove( mFragment );
mFragment = null;
}
}
@Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
// Intent intent;
ActionBar ab = getActionBar();
ab.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS );
Tab tab = ab.newTab()
.setText( R.string.title_param )
.setTabListener(
new MyTabListener( this,
Param.class.getName() ) );
ab.addTab( tab );
// intent = new Intent().setClass(this, Friends.class);
tab = ab.newTab()
.setText( R.string.title_friends )
.setTabListener(
new MyTabListener( this,
Friends.class.getName() ) );
ab.addTab( tab );
tab = ab.newTab()
.setText( R.string.title_maps )
.setTabListener(
new MyTabListener( this,
Maps.class.getName() ) );
ab.addTab( tab );
}
@Override
public boolean onCreateOptionsMenu( Menu menu )
{
getMenuInflater().inflate( R.menu.main, menu );
return true;
}
@Override
public boolean onOptionsItemSelected( MenuItem item )
{
boolean ret;
if (item.getItemId() == R.id.menu_settings)
{
// Handle Settings
ret = true;
} else
{
ret = super.onOptionsItemSelected( item );
}
return ret;
}
}
タブ 1:
package com.stylingandroid.basicactionbar;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.app.Fragment;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class Param extends Fragment
{
Button btnShowLocation;
private View V;
TextView text;
public static double latitude;
public static double longitude;
// GPSTracker class
GPSTracker gps;
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState )
{
V = inflater.inflate( R.layout.param, container, false );
gps = new GPSTracker(getActivity());
if(gps.canGetLocation()){
text = (TextView) V.findViewById(R.id.widget35);
latitude = gps.getLatitude();
longitude = gps.getLongitude();
String cityName=null;
Geocoder gcd = new Geocoder(getActivity(), Locale.getDefault());
List<Address> addresses;
try {
addresses = gcd.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0)
System.out.println(addresses.get(0).getLocality());
cityName=addresses.get(0).getLocality();
} catch (IOException e) {
e.printStackTrace();
}
// create class object
// check if GPS enabled
text.setText(cityName);
}else{
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
gps.showSettingsAlert();
}
return V;
}
}
タブ 2:
package com.stylingandroid.basicactionbar;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.Toast;
public class Friends extends Fragment implements OnChildClickListener
{
private static List<Country> Countries;
private ExpandableListView expandableListView;
private CountryAdapter adapter;
private View V;
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState )
{
V = inflater.inflate( R.layout.frag2, container, false );
expandableListView = (ExpandableListView) V.findViewById(R.id.expandableListView);
expandableListView.setOnChildClickListener(this);
LoadCountries();
return V;
}
private void LoadCountries() {
Countries = new ArrayList<Country>();
ArrayList<String> citiesAustralia = new ArrayList<String>(
Arrays.asList("Brisbanea", "Hobart", "Melbourne", "Sydney"));
Countries.add(new Country("Australia", citiesAustralia));
ArrayList<String> citiesChina = new ArrayList<String>(
Arrays.asList("Beijing", "Chuzhou", "Dongguan", "Shangzhou"));
Countries.add(new Country("China", citiesChina));
adapter = new CountryAdapter(getActivity(), Countries);
expandableListView.setAdapter(adapter);
}
@Override
public boolean onChildClick(ExpandableListView arg0, View arg1, int arg2,
int arg3, long arg4) {
/* Fragment param = new Param();
android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frag2, param);
ft.addToBackStack(null);
ft.commit();
*/
Toast.makeText(getActivity(), "Clicked on Detail " , Toast.LENGTH_LONG).show();
return true;
}
}
タブ 3:
package com.stylingandroid.basicactionbar;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Maps extends Fragment
{
static final LatLng HAMBURG = new LatLng(Param.latitude, Param.longitude);
static final LatLng KIEL = new LatLng(53.551, 9.993);
private GoogleMap map;
View V;
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState )
{
V = inflater.inflate( R.layout.frag1, container, false );
map = ((MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.map))
.getMap();
Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG)
.title("Hamburg"));
// Move the camera instantly to hamburg with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));
// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
GoogleMap gMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
gMap.setMyLocationEnabled(true);
gMap.getUiSettings().setCompassEnabled(true);
Log.e("Maps", "------EOC-------");
return V;
}
}
param.xml (タブ 1):
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ToggleButton
android:id="@+id/widget33"
android:layout_width="125dp"
android:layout_height="59dp"
android:textOn="I'm free!"
android:textOff="I'm free!"
android:layout_x="78dp"
android:layout_y="29dp" />
<TextView
android:id="@+id/widget34"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Lieu actuel"
android:layout_x="87dp"
android:layout_y="196dp" />
<TextView
android:id="@+id/widget35"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Indisponible"
android:layout_x="101dp"
android:layout_y="247dp" />
<TextView
android:id="@+id/widget36"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GPS"
android:layout_x="89dp"
android:layout_y="108dp" />
<ToggleButton
android:id="@+id/widget37"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="On"
android:textOff="Off"
android:layout_x="158dp"
android:layout_y="99dp" />
</AbsoluteLayout>
frag2.xml (タブ 2):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ExpandableListView
android:id="@+id/expandableListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
frag1.xml (タブ 3):
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
</RelativeLayout>
ここでは主要なフラグメントのみを示します。必要に応じて、すべてのクラスの完全なコードを提供することもできます...
質問:
フラグメントがどのように機能するかについて私が始めたことは大丈夫ですか? 代わりにアクティビティを使用する必要がありますか? フラグメントを作成する方法は大丈夫ですか? プログラミング標準を尊重しますか? フラグメントから別のフラグメントに通信する方法は? グローバル変数を使用しているため、何かが更新されると gmap (tab3) も更新されますが、クリックで gmap フラグメントを開く方法がわかりません。
gmap タブを 2 回クリックすると、gmap によってアプリがクラッシュします...?
どうもありがとう。