我有一个标签式活动,想要在第一个标签中显示:
如果单击了listview的一项,我想在第一个选项卡中显示另一个片段,其中包含:
然后,如果按下后退按钮,我想返回上一个片段(在同一个标签中)。如果第二个列表视图(虽然可见)的arraylist的数据已经改变,我想对第一个listview的arraylist采用这些更改。所以我想尽可能容易地访问两个列表视图的数据。
我的第一种方法是:一切都在一个片段中,有一个布局(包括不同的视图,我隐藏/显示)。 < - 我不喜欢这个,这个课程变得庞大/混乱。
我的第二种方法是:第一个片段/标签有另一个包含2个片段的viewpager。 < - 我猜这太复杂了(f.i。主要活动标签之间的刷卡干扰了新的viewpager,需要处理)。
对此最好的apprpach是什么?
答案 0 :(得分:0)
创建您的PageFragment。它将由ViewPager适配器创建并放置在ViewPager中。使用通过getChildFragmentManager()方法获得的FragmentManager来切换ListFragment内部的PageFragment。
处理背压事件很复杂,您需要从活动中提供。 创建界面
public interface IBackStackManager {
void addBackStackListener(BackStackListener listener);
void removeBackStackListener(BackStackListener listener);
interface BackstackListener {
boolean onBackPressed();
}
}
使用您的活动实现它:
public class MainActivity extends AppCompatActivity implements IBackStackManager {
private final Deque<BackStackListener> backStackListeners = new ArrayDeque<>();
@Override
public void addBackstackListener(BackStackListener listener) {
backStackListeners.add(listener);
}
@Override
public void removeBackStackListener(BackStackListener listener) {
backStackListeners.remove(listener);
}
@Override
public void onBackPressed() {
boolean result = false;
if (backStackListeners.size() > 0) {
BackStackListener listener = backStackListeners.peekLast();
result = listener.onBackPressed();
}
if (!result) {
super.onBackPressed();
}
}
}
在PageFragment中使用onAttach和onDetach方法注册回堆栈侦听器
class PageFragment extends Fragment implements IBackStackManager.BackStackListener {
protected IBackStackManager backStackManager;
onAttach(Context context){
super.onAttach(context);
try{
backStackManager = (IBackStackManager) context;
backStackManager.addBackStackListener(this);
} catch(ClassCastException ex){
ex.printStacktrace();
}
}
onDetach(){
super.onDetach();
if (backStackManager != null){
backStackManager.removeBackStackListener(this);
}
}
boolean onBackPressed(){
if (getChildFragmentManager().getBackStackEntryCount() > 0){
getChildFragmentManager().popBackStack();
return true;
} else {
return false;
}
}
}