0

我已经开始构建一个应用程序,但我认为我可能在主结构中做错了什么。我的应用程序是 3 个片段,相互通信。第一个片段是关于设置的,第二个片段是一个可扩展的数组列表。第三个是Gmap。

单击第一个片段中的特定设置(即位置)将使gmap在好位置打开......第二个片段中的子项也是如此。我也想有一个线程来更新所有片段的当前位置。

这是,我不知道我应该如何构建我的应用程序。有 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 (tab1):

<?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 (tab2):

<?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 (tab3):

<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 选项卡上单击两次时,gmap 使应用程序崩溃...?

非常感谢你们。

4

1 回答 1

0

你可以使用所有你想要的片段:)

我认为最好的方法是创建一个抽象类来保存和处理所有数据和事件。

在抽象类中声明静态方法,以便您可以直接在类上调用它们。

于 2013-10-14T16:55:58.217 回答