0

在我开始之前,是的,我已经阅读了无数相关的问题。我似乎仍然无法找到问题所在。

我有一个 SherlockFragmentActivity:

package com.kicklighterdesignstudio.floridaday;

import android.os.Bundle;
import android.support.v4.app.Fragment;

public class FragmentActivity extends BaseActivity {

public static final String TAG = "FragmentActivity";

public static final int SCHEDULE_FRAGMENT = 0;
public static final int MAP_FRAGMENT = 1;
public static final int FOOD_FRAGMENT = 2;
public static final int TWITTER_FRAGMENT = 3;
public static final int HASHTAG_FRAGMENT = 4;

private Fragment mContent;

public FragmentActivity() {
    super(R.string.main_activity_title);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.content_frame);
    switchContent(SCHEDULE_FRAGMENT);
    setBehindContentView(R.layout.menu_frame);

}

public void switchContent(int id) {
    getFragment(id);
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent)
            .commit();
    getSlidingMenu().showContent();
}

private void getFragment(int id) {
    switch (id) {
    case 0:
        mContent = new ScheduleFragment();
        break;

    case 1:
        mContent = new FoodFragment();
        break;

    case 2:
        mContent = new MapFragment();
        break;

    case 3:
        mContent = new TwitterFragment();
        break;

    case 4:
        mContent = new HashtagFragment();
        break;
    }
}

}

它扩展了 BaseActivity:

package com.kicklighterdesignstudio.floridaday;

import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;

import com.actionbarsherlock.view.MenuItem;
import com.slidingmenu.lib.SlidingMenu;
import com.slidingmenu.lib.app.SlidingFragmentActivity;

public class BaseActivity extends SlidingFragmentActivity {

//  private int mTitleRes;
protected ListFragment mFrag;

public BaseActivity(int titleRes) {
//      mTitleRes = titleRes;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

//      setTitle(mTitleRes);
    setTitle("");

    // set the Behind View
    setBehindContentView(R.layout.menu_frame);
    if (savedInstanceState == null) {
        FragmentTransaction t = this.getSupportFragmentManager().beginTransaction();
        mFrag = new MenuFragment();
        t.replace(R.id.menu_frame, mFrag);
        t.commit();
    } else {
        mFrag = (ListFragment) this.getSupportFragmentManager().findFragmentById(
                R.id.menu_frame);
    }

    // customize the SlidingMenu
    SlidingMenu sm = getSlidingMenu();
    sm.setShadowWidthRes(R.dimen.shadow_width);
    sm.setShadowDrawable(R.drawable.shadow);
    sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
    sm.setFadeDegree(0.35f);
    sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    sm.setBehindScrollScale(0.0f);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        toggle();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

}

现在,我只关心 ScheduleFragment:

package com.kicklighterdesignstudio.floridaday;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.actionbarsherlock.app.SherlockFragment;

public class ScheduleFragment extends SherlockFragment implements OnItemClickListener {

public static final String TAG = "ScheduleFragment";

private ArrayList<ScheduleItem> schedule;
private FloridaDayApplication app;

public ScheduleFragment() {
//      setRetainInstance(true);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    app = (FloridaDayApplication) activity.getApplication();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.schedule_fragment, container, false);
}

@Override
public void onStart() {
    super.onStart();
    getSherlockActivity().getSupportActionBar().setTitle(R.string.schedule_fragment);

    schedule = app.getSchedule();

    ListView scheduleListView = (ListView) getActivity().findViewById(R.id.schedule_list);
    ScheduleItemAdapter adapter = new ScheduleItemAdapter(getActivity(), schedule);
    scheduleListView.setAdapter(adapter);
    scheduleListView.setOnItemClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> a, View v, int id, long position) {

    Fragment newFragment = new ScheduleItemFragment(id);

    FragmentTransaction transaction = getSherlockActivity().getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.content_frame, newFragment).addToBackStack(null).commit();

}

}

ScheduleFragment 显示计划项目的列表。单击时,将显示一个新片段 (ScheduleItemFragment) 以显示项目的详细信息和到其位置的地图:

package com.kicklighterdesignstudio.floridaday;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.model.MarkerOptions;

@SuppressLint("ValidFragment")
public class ScheduleItemFragment extends SherlockFragment {

public static final String TAG = "ScheduleItemFragment";

private int scheduleItemId;
private FloridaDayApplication app;
private ScheduleItem scheduleItem;
private MapView mapView;
private GoogleMap map;

public ScheduleItemFragment(int id) {
    scheduleItemId = id;
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    app = (FloridaDayApplication) activity.getApplication();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.schedule_item_fragment, container, false);
    setHasOptionsMenu(true);

    // Initialize MapView
    mapView = (MapView) v.findViewById(R.id.map_view);
    mapView.onCreate(savedInstanceState);

    return v;
}

@Override
public void onStart() {
    super.onStart();
    scheduleItem = app.getSchedule().get(scheduleItemId);
    getSherlockActivity().getSupportActionBar().setTitle(scheduleItem.getTitle());

    // Map Stuff
    map = mapView.getMap();
    if (map != null) {
        map.getUiSettings();
        map.setMyLocationEnabled(true);

        try {
            MapsInitializer.initialize(getActivity());
        } catch (GooglePlayServicesNotAvailableException e) {
            e.printStackTrace();
        }

        // Add marker to the map
        MarkerOptions options = new MarkerOptions().position(scheduleItem.getLocation().getPosition()).title(
                scheduleItem.getLocation().getTitle());
        map.addMarker(options);

        // Adjust Camera Programmatically
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(
                scheduleItem.getLocation().getPosition(), 14);
        map.animateCamera(cameraUpdate);
    } else {
        Log.i(TAG, "Map is null");
    }

    // Other Views
    TextView title = (TextView) getSherlockActivity().findViewById(R.id.title);
    TextView time = (TextView) getSherlockActivity().findViewById(R.id.time);
    TextView description = (TextView) getSherlockActivity().findViewById(R.id.description);

    title.setText(scheduleItem.getTitle());
    time.setText(scheduleItem.getDateTimeString());
    description.setText(scheduleItem.getDescription());

}

// TODO: Make this work
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        getFragmentManager().popBackStack();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public void onDestroy() {
    mapView.onDestroy();
    super.onDestroy();
}

@Override
public void onLowMemory() {
    mapView.onLowMemory();
    super.onLowMemory();
}

@Override
public void onPause() {
    mapView.onPause();
    super.onPause();
}

@Override
public void onResume() {
    mapView.onResume();
    super.onResume();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    mapView.onSaveInstanceState(outState);
    super.onSaveInstanceState(outState);
}

}

感谢 BaseActivity,我的 ActionBar 中的图标是可点击的。它切换滑动菜单。查看 ScheduleItemFragment 时,我希望图标返回到 backstack 中的上一个项目(您可以看到我正在尝试这样做。)无论我尝试什么,图标总是切换滑动菜单。关于如何保证我的 Fragment 获得对 ActionBar 菜单点击的控制的任何想法?

4

1 回答 1

0

你需要打电话setHasOptionsMenu(true);onCreate而不是onCreateView

我也很感兴趣当你调试时会发生什么,onOptionsItemSelected 是否仍然被调用?

编辑:将以下内容添加到您的片段中

@Override
public void onCreate(Bundle savedInstanceState) {
    setHasOptionsMenu(true);
    super.onCreate(savedInstanceState);
}

public bool isItemFragmentOnTop 编辑1:可能有更好的方法来做到这一点,但我不确定你的片段是如何设置的,现在在baseActivity中创建一个公共字段,以防onOptionsItemSelected主页按钮被按下这样做

if (isItemFragmentOnTop){
   getFragmentManager().popBackStack();
   isItemFragmentOnTop = false;
} else {
   toggle();
}
return true;

然后在您的片段中,您可以调用((BaseActivity)getActivity).isItemFragmentOnTop = true;以使主页按钮弹出返回堆栈,当您在列表视图中显示片段 onItemClick 时,您会想要这样做。

于 2013-05-03T16:47:47.140 回答