0

アプリケーションの構築を開始しましたが、メイン構造で何か間違ったことをしている可能性があります。私のアプリケーションは、互いに通信する 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&apos;m free!"
    android:textOff="I&apos;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 によってアプリがクラッシュします...?

どうもありがとう。

4

1 に答える 1

0

必要なすべてのフラグメントを使用できます:)

すべてのデータとイベントを保存して処理する抽象クラスを作成する最善の方法だと思います。

抽象クラスで静的メソッドを宣言して、クラスで直接呼び出すことができるようにします。

于 2013-10-14T16:55:58.217 に答える