后退堆栈(Backstack)在 Android Wear 上不起作用

6

我正在尝试创建一个Android Wear应用程序,它只有一个活动,并且其中包含一个片段。我希望能够根据按钮点击或其他用户操作切换片段。

我可以很好地替换片段;但是,当我从屏幕的左侧向右侧滑动时,应用程序会关闭。我预期这个手势应该像返回按钮一样,而不是退出应用程序。

主要活动

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import  android.support.v4.app.FragmentTransaction;
import android.support.wearable.view.WatchViewStub;


public class MainActivity extends FragmentActivity implements FragmentChangeListener {

    int  fragmentContainerId;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        final WatchViewStub stub = (WatchViewStub)findViewById(R.id.watch_view_stub);


        // instialize the fragment to the loading page
        stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
            @Override
            public void onLayoutInflated(WatchViewStub watchViewStub) {
                fragmentContainerId =  R.id.fragmentContainer;

                if (watchViewStub.findViewById(R.id.fragmentContainer) != null) {




                    Fragment1 fragment1= new Fragment1 ();

                    // In case this activity was started with special instructions from an Intent,
                    // pass the Intent's extras to the fragment as arguments
                    fragment1.setArguments(getIntent().getExtras());

                    // Add the fragment to the 'fragment_container'
                    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.add(R.id.fragmentContainer, fragment1).addToBackStack(null);
                    fragmentTransaction.commit();
                }
            }
        });
    }

    @Override
    public void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragmentContainer, fragment, fragment.toString()).addToBackStack(null);
        System.out.println("Entry count in backstack is: " + fragmentManager.getBackStackEntryCount());
        fragmentTransaction.commit();
    }
}

片段 1

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;



public class Fragment1 extends Fragment {


    public Fragment1() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment1,
                container, false);

        Button button1= (Button)view.findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Fragment2 fragment2= new Fragment2 ();
                FragmentChangeListener fc=(FragmentChangeListener)getActivity();
                fc.replaceFragment(fragment2);
            }
        });
        return view;
    }
}

片段 2

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


/**
 * A simple {@link Fragment} subclass.
 */
public class Fragment2 extends Fragment {


    public Fragment2() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v =inflater.inflate(R.layout.fragment2, container, false);

        return v;
    }


}

FragmentChangeListner

import android.support.v4.app.Fragment;


public interface FragmentChangeListener
{
    public void replaceFragment(Fragment fragment);
}

当我通过按钮点击从Fragment1导航到Fragment2时,如何在不退出应用程序的情况下导航回Fragment1?


你找到解决方案了吗? - Muneef M
2个回答

2

一种解决方案是将第二个布局包装在

android.support.wearable.view.SwipeDismissFrameLayout

内。然后您可以捕获dismiss手势,并在父活动中调用getFragmentManager().popBackStack();

您可以像这样在SwipeDismissFrameLayout上设置监听器: swipeFrame.setDismissEnabled(true); swipeFrame.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() { @Override public void onDismissed(SwipeDismissLayout swipeDismissLayout) { getActivity().getFragmentManager().popBackStack(); } });


能否在滑动消失的Fragment后面显示先前的Fragment?就像Activity的工作方式一样。 - Thomas Vos

0

如果您考虑使用GridViewPager类,那么有一个潜在的hacky解决方案可供使用。它允许您向后滑动以查看先前的内容。您需要在滑动时刷新视图以模拟动态返回堆栈,但这是可以实现的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接