RelativeLayout里面的Android Fragment崩溃app

时间:2013-07-01 09:08:35

标签: java android android-fragments

我正在将应用程序转换为android并且在片段方面遇到一些麻烦。

当我没有RelativeLayout而只有Fragment时它工作正常,但是随着布局(rel或线性)的引入,它会崩溃。我试图在地图的顶部添加一些按钮,最好是覆盖而不是在自己的空间中。

event_layout.xml:

<RelativeLayout android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/relativeLayout">
    <fragment
       android:id="@+id/the_map"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       class="com.google.android.gms.maps.SupportMapFragment"/>
    <Button android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="Start service"/>
</RelativeLayout>

MainActivity.java:

public class MainActivity extends FragmentActivity {
    // Fragment TabHost as mTabHost
     private FragmentTabHost mTabHost;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // set up the tabhost
         mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
            mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
            mTabHost.addTab(mTabHost.newTabSpec("event").setIndicator("Event Locations",
                    getResources().getDrawable(R.drawable.ic_event_tab)),
                    EventFragment.class, null);
            mTabHost.addTab(mTabHost.newTabSpec("itin").setIndicator("Itinerary",
                    getResources().getDrawable(R.drawable.ic_itin_tab)),
                       ItineraryFragment.class, null);
            mTabHost.addTab(mTabHost.newTabSpec("info").setIndicator("Kendal Info",
                    getResources().getDrawable(R.drawable.ic_info_tab)),
                    KendalInfoFragment.class, null);

            mTabHost.getTabWidget().setBackgroundColor(Color.WHITE);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

EventFragment.java:

public class EventFragment extends FragmentActivity {

    private int userIcon, foodIcon, drinkIcon, shopIcon, otherIcon;
    private GoogleMap theMap;
    private LocationManager locMan;
    private Marker userMarker;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

        View V = inflater.inflate(R.layout.event_layout, container, false);

        // now run code below the inflate

        if(theMap==null){
            //map not instantiated yet
            theMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.the_map)).getMap();

        }

        //theMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        //updatePlaces();

        theMap.setMyLocationEnabled(true);

        theMap.moveCamera( CameraUpdateFactory.newLatLngZoom(new LatLng(54.328337, -2.743149) ,14) );

        JSONArray arrayResultFromURL;

        // store the result of the data into the variable
        arrayResultFromURL = getJSONfromURL("http://www.websitewebsitestr.org/json.php?f=all&type=dateAndTime");
        try{
            //Log.d("array_len", String.format("%d", arrayResultFromURL.length()));

            for(int i=0;i<arrayResultFromURL.length();i++){
                JSONObject json_data = arrayResultFromURL.getJSONObject(i);

                // assign attributes from the JSON string to local variables
                String id =json_data.getString("id");
                String title =json_data.getString("title");
                String strap; // define this for the try catch

                // this try catch is in case the client does not 
                // put a strap in, title is mandatory
                try{
                    strap =json_data.getString("strap");
                }catch(Exception e){
                    strap = "";
                }

                Double lat = (double) 0;
                Double lon = (double) 0;

                // if the lat and long have not been entered then set them to 0
                // otherwise an exception is thrown, and if it is lat and long will
                // become 0, putting them down south.
                try{
                    lat = (double) json_data.getDouble("lat");
                }catch(Exception e){
                    lat = (double) 0;
                }

                try{
                    lon = (double) json_data.getDouble("long");
                }catch(Exception e){
                    lon = (double) 0;
                }

                theMap.addMarker(new MarkerOptions()
                .position(new LatLng(lat, lon))
                .title(title)
                .snippet(strap));
            }
        }catch (Exception e){
            Log.e("log_tag", "error in array: " + e.toString());
        }


        //Log.d("log_tag", "result: " + res);
        //Log.d("log_tag", "point debug!");

        //Log.d("myApp", res.toString());

        userIcon = R.drawable.common_signin_btn_icon_dark;
        /*foodIcon = R.drawable.red_point;
        drinkIcon = R.drawable.blue_point;
        shopIcon = R.drawable.green_point;
        otherIcon = R.drawable.purple_point;*/

        //return V;
        return inflater.inflate(R.layout.event_layout, container, false);
    }

    public static JSONArray getJSONfromURL(String url){

        //initialize
        InputStream is = null;   
        String result = "";   
        JSONArray jArray = null;

        //http post
        try {

            HttpClient httpclient = new DefaultHttpClient();   
            HttpPost httppost = new HttpPost(url);    
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();

            is = entity.getContent();    

        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection "+e.toString());   
        }
        //convert response to string

        try {

            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);  
            StringBuilder sb = new StringBuilder();   
            String line = null;

            while ((line = reader.readLine()) != null) {   
                sb.append(line);
            }

            is.close();
            result=sb.toString();

        } catch (Exception e) {    
            Log.e("log_tag", "Error converting result "+e.toString());
        }
        //try parse the string to a JSON object

        try {
            //Log.d("log_tag", "jresult: " + result + "finish");
            jArray = new JSONArray(result);

            //Log.e("log_tag", "result: " + jArray.toString());

        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data "+e.toString());
        }

        return jArray;
    }


     public boolean onMarkerClick(Marker marker) {
         Log.d("Debug_log", "clicked!!");
         return true;
     }

}

它产生了这个错误:

    07-01 11:00:29.428: E/AndroidRuntime(24381): FATAL EXCEPTION: main
07-01 11:00:29.428: E/AndroidRuntime(24381): java.lang.ClassCastException: co.uk.thewebsite.websitewebsitefest.EventFragment
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.support.v4.app.Fragment.instantiate(Fragment.java:394)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.support.v4.app.FragmentTabHost.doTabChanged(FragmentTabHost.java:339)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:276)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.view.View.dispatchAttachedToWindow(View.java:6203)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1174)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1179)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1179)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1179)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.view.ViewRoot.performTraversals(ViewRoot.java:797)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1921)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.os.Looper.loop(Looper.java:143)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at android.app.ActivityThread.main(ActivityThread.java:4196)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at java.lang.reflect.Method.invokeNative(Native Method)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at java.lang.reflect.Method.invoke(Method.java:507)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-01 11:00:29.428: E/AndroidRuntime(24381):    at dalvik.system.NativeStart.main(Native Method)

我已尝试在其他stackoverflow帖子上建议使用框架,但应用程序崩溃或出错,我无法解决它。过去一周我在android中学到了很多东西,我很高兴将来能学到更多东西!

1 个答案:

答案 0 :(得分:2)

试试此代码

map = ((SupportMapFragment) getSupportFragmentManager()
        .findFragmentById(R.id.map)).getMap();

并导入

import android.support.v4.app.FragmentActivity;

在你这样做之前 右键单击项目 - &gt; properties-&gt; buildpath-&gt; java构建路径 - &gt;库..然后点击添加外部罐子

转到

  

\机器人-的SDK \额外\机器人\支持\ V4

并选择android-support-v4.jar