- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我编写的 MainActivity 的代码。我正在第一个屏幕中加载 fragment 列表。当用户点击任何列表项时,行星名称将在我在单独的类中定义的详细信息 fragment 中显示给用户。
我正在将“Fragment Planet List”->“Fragment Planet Detail”事务添加到后台堆栈。所以我期望的是,当我从行星细节 fragment 中按下后退按钮时,它应该会在手机中加载行星列表。但事实并非如此。
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.FrameLayout;
import com.meditab.fragments.fragment.FragmentPlanetDetail;
import com.meditab.fragments.fragment.FragmentPlanetList;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends ActionBarActivity implements Callback {
private FrameLayout frmPlanetList;
private FrameLayout frmPlanetDetail;
private boolean isPhone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
frmPlanetList = (FrameLayout) findViewById(R.id.frmPlanetList);
frmPlanetDetail = (FrameLayout) findViewById(R.id.frmPlanetDetail);
if (null != frmPlanetDetail) {
isPhone = false;
} else {
isPhone = true;
}
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frmPlanetList, new FragmentPlanetList());
fragmentTransaction.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onListItemClicked(int intPosition) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
List<String> lstPlanetArray = getPlanetArray();
String strPlanetName = lstPlanetArray.get(intPosition);
FragmentPlanetDetail fragmentPlanetDetail = FragmentPlanetDetail.newInstance(strPlanetName);
if (isPhone) {
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.frmPlanetList, fragmentPlanetDetail);
} else {
fragmentTransaction.replace(R.id.frmPlanetDetail, fragmentPlanetDetail);
}
fragmentTransaction.commit();
}
private List<String> getPlanetArray() {
List<String> lstPlanets = new ArrayList<>(10);
lstPlanets.add("Mercury");
lstPlanets.add("Venus");
lstPlanets.add("Earth");
lstPlanets.add("Mars");
lstPlanets.add("Jupiter");
lstPlanets.add("Saturn");
lstPlanets.add("Uranus");
lstPlanets.add("Neptune");
lstPlanets.add("Saturn");
return lstPlanets;
}
}
但是,如果我重写 backPress 方法并以编程方式弹出返回堆栈,它就可以正常工作。
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() != 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
如果我想实现这种行为,是否需要以这种方式覆盖 onBackPressed() 方法?没有记录您需要在此链接中覆盖此方法。 Android Back Press Fragment Documentation
fragment 行星细节类
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.meditab.fragments.R;
/**
* Created by BHARGAV on 25-Dec-14.
*/
public class FragmentPlanetDetail extends Fragment {
private String strPlanetName;
public FragmentPlanetDetail() {
}
public static FragmentPlanetDetail newInstance(String strPlanetName) {
FragmentPlanetDetail fragmentPlanetDetail = new FragmentPlanetDetail();
Bundle bundle = new Bundle();
bundle.putString("Planet_Name", strPlanetName);
fragmentPlanetDetail.setArguments(bundle);
return fragmentPlanetDetail;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (null != bundle) {
strPlanetName = bundle.getString("Planet_Name");
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.planet_name, container, false);
TextView txtPlanetName = (TextView) rootView.findViewById(R.id.txtPlanetName);
txtPlanetName.setText(strPlanetName);
return rootView;
}
}
fragment 行星列表类:
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.meditab.fragments.Callback;
import com.meditab.fragments.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by BHARGAV on 25-Dec-14.
*/
public class FragmentPlanetList extends Fragment {
private ListView listView;
private ArrayAdapter<String> stringArrayAdapter;
private Callback callback;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.listview, container, false);
listView = (ListView) rootView.findViewById(R.id.listView);
stringArrayAdapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1, getPlanetArray());
listView.setAdapter(stringArrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
callback.onListItemClicked(position);
}
});
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback = (Callback) activity;
}
private List<String> getPlanetArray() {
List<String> lstPlanets = new ArrayList<>(5);
lstPlanets.add("Mercury");
lstPlanets.add("Venus");
lstPlanets.add("Earth");
lstPlanets.add("Mars");
lstPlanets.add("Jupiter");
lstPlanets.add("Saturn");
lstPlanets.add("Uranus");
lstPlanets.add("Neptune");
lstPlanets.add("Saturn");
return lstPlanets;
}
}
回调接口(interface):
/**
* Created by BHARGAV on 26-Dec-14.
*/
public interface Callback {
public void onListItemClicked(int intPosition);
}
谢谢。如果需要任何其他详细信息或代码,请告诉我。
最佳答案
好的。所以它不起作用的原因是 ActionBarActivty 和 Activity 类差异的冲突。以及FragmentTransaction的getSupportFragmentManager()和getFragmentManager()方法的区别。
Action 条 Activity :
我使用的是 android.support.v7.app.ActionBarActivity
的 ActionBarActivity。这意味着我使用的是 v7 兼容库
fragment 管理器: fragment 管理器不是来自兼容库。直接是
import android.app.FragmentManager;
import android.app.FragmentTransaction;
如您在 MainActivity 类中所见。
fragment :android.app.Fragment
;是在单独的 fragment 类中导入的类。
因此,一旦我从 ActionBarActivity 更改为 Activity 类,一切正常。当我更改 FragmentManager、FragmentTransaction 和 Fragment 类以支持库类时,情况也是如此。
所以在任何修改之后,事情开始正常工作。谢谢。
关于android - 如果不覆盖 android 中的 onBackPressed() 方法,addToBackStack() 方法将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659038/
在 Android 上的 FragmentTransaction 项中 docs ,说明方法replace()与调用方法remove()是一样的,对当前view中添加的所有fragment调用方法添加
我正在尝试关闭 fragment 并希望通过在我的 fragment 实现中使用 addToBackStack 来恢复主要 Activity ,但它不起作用。后退按钮正在关闭应用程序。 我使用的 fr
在我的应用程序中,我正在处理一个显示不同 fragment 的 Activity 。该 Activity 还具有抽屉布局。 activity_main.xml: 所以现在我试图通过替换它们
我就是不明白。 我有一个 Activity A、一个 Fragment F1 和一个 Fragment F2。当 Activity 启动时,它会通过 F1 打开 getFragmentManager(
我的 MainActivity 管理两个一起工作的 fragment 。我的方法之一是我的 ListFragment 上的监听器接口(interface),MainActivity 负责切换 frag
这是负责将 fragment 添加到后台堆栈的函数: public void populateContent(File f) { ContentFragment cf = new Conten
有什么办法可以让这个更干净一点吗?我知道当 query = ""时我位于主菜单,因此返回应该关闭应用程序。 if (query == "") { fragmen
当我们在 fragment 中使用 addToBackStack() 时如何设置动画? 我的旧片段需要保留,新片段应该将旧片段与动画重叠并显示给用户。 我尝试了 setCustomAnimation(
按后退按钮后,单击按钮时显示的新 fragment 不会关闭,而是关闭整个应用程序。该按钮位于三个选项卡之一内。 mainActivity.java、HeroesFragment(具有三个选项卡的 f
我被它弄糊涂了。 我有一个 Activity A,Fragment F1 和 F2,当单击一个按钮时,我想隐藏 F1 并将 F2 添加到同一位置,然后可以通过后退按钮返回到 F1。所以我做了如下。
这是我的主要 Activity 。我关注了this guide关于 fragment 正确。当我单击“后退”按钮时,我的应用程序关闭而不是返回到 MainScreenFragment。为什么会发生这种
我有一个 FragmentActivity,它在启动时加载一个自定义 ListFragment,并在单击某项后用新 fragment 替换它。 在 fragment Activity 子类中: pub
每当我按下我的应用程序的后退按钮时,就会发生以下情况。 原创手机展示:FragA 点击 FragA 上的 View 后手机展示:FragB 点击返回按钮后手机显示: fragment A fragme
我正在研究 Fragments,在区分 FragmentTransaction.replace(id, fragment, tag) 和 FragmentTransaction.addToBackSt
当我按下“后退”按钮(在模拟器和 Galaxy S2 上测试)时,无论提交了多少 fragment 事务,应用程序都会关闭:( 好吧,以防万一,我会发布我的 fragment 事务的实现,尽管我怀疑它
我的应用程序有选项卡,在一个选项卡中,我有一个带有 ListView 的 fragment 。单击列表中的项目时,我尝试使用以下内容在该选项卡下初始化一个新 fragment : private cl
我在使用 FragmentTransaction addToBackStack 时发现了一个奇怪的行为。每当手机旋转时,它都会重新创建堆栈中的所有 fragment 。为什么要重新创建这些 fragm
我在抽屉导航 Activity 中创建了一个选项卡式 Activity 。我已将抽屉导航内的列表与各个 fragment 链接起来。我还在 ft.commit() 之前使用了命令 ft.addToBa
我没有找到解决问题的方法。 我有几个 fragment (动态创建),但我的后退按钮根本不起作用,按下它将关闭应用程序,无论 fragment 是“Activity 的”。 @Override pub
具有添加 fragment 和稍后的 replace() fragment 的流程。所有 fragment 都是动态添加的,但不是所有 fragment 都调用addToBackStack()。 ge
我是一名优秀的程序员,十分优秀!