Android Eclipse到Android Studio
自从宣布退出Eclipse支持以来,我正在将我的应用程序从Eclipse内置的minSdk 8 targetSdk 19移动到Android Studio内置的minSdk 14 targetSdk 22 我不想让Android Studio执行转换,而是想创建一个新项目并手动移植代码 我卡住了 我有一个从AppCompatActivity扩展而来的主活动,它使用一个导航抽屉和一个工具栏,所有这些都可以正常工作。我的片段也可以加载,直到我尝试引用工具栏 我的主要活动代码是:Android Eclipse到Android Studio,android,eclipse,android-fragments,android-studio,Android,Eclipse,Android Fragments,Android Studio,自从宣布退出Eclipse支持以来,我正在将我的应用程序从Eclipse内置的minSdk 8 targetSdk 19移动到Android Studio内置的minSdk 14 targetSdk 22 我不想让Android Studio执行转换,而是想创建一个新项目并手动移植代码 我卡住了 我有一个从AppCompatActivity扩展而来的主活动,它使用一个导航抽屉和一个工具栏,所有这些都可以正常工作。我的片段也可以加载,直到我尝试引用工具栏 我的主要活动代码是: public cla
public class MainActivity extends AppCompatActivity implements BlankTestFragment.OnFragmentInteractionListener {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
...
...
我加载的片段代码是:
public class BlankTestFragment extends Fragment {
...
private Toolbar toolbar;
...
public static BlankTestFragment newInstance(String param1, String param2) {
BlankTestFragment fragment = new BlankTestFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public BlankTestFragment() {
// Required empty public constructor
}
public final static String TAG = BlankTestFragment.class.getSimpleName();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
toolbar = ((AppCompatActivity)getActivity()).getSupportActionBar();
}
最后一行报告:
Incompatible Types:
Required: android.support.v7.widget.Toolbar
Found: android.support.v7.app.Actionbar
那么,出了什么问题?Actionbar参考来自哪里
解决方案
在主要活动中,我添加了:
public static Toolbar getToolbar(){
return toolbar;
}
在我的测试片段中,在Nantach中,我添加了:
toolbar = MainActivity.getToolbar();
toolbar.setTitle("hello");
解决方案2
事实证明,我的测试片段中只有一个小错误,使我的原始实现无法工作
在MainActivity中,我将工具栏设置为SupportActionBar。所以当我试着
toolbar = ((AppCompatActivity)getActivity()).getSupportActionBar();
在片段中,我将工具栏设置为
private Toolbar toolbar;
但那时它已经不是工具栏了,所以我把它改成了
private ActionBar toolbar;
一切都很顺利
Actionbar参考来自哪里
getSupportActionBar()
的返回值是android.support.v7.app.ActionBar的一个实例,如中所示。不能将其分配给工具栏
字段,因为工具栏
不继承自操作栏
在封面下,setSupportActionBar()
将您的工具栏
包装到另一个对象中。我看不到一个简单的方法来恢复工具栏。因此,请尝试使用ActionBar
包装,该包装将getSupportActionBar()
返回。删除代码getActivity()).getSupportActionBar()代码>。只需将其替换为从main活动
获取工具栏
的代码,方法是从该活动调用公共get方法。Commonware已经给出了一个很好的提示。谢谢,我已经在问题的底部添加了我的解决方案版本。谢谢。你的评论加上公共软件帮助我达成了一个共识solution@DaveSav,你可以将两个贴出的答案都选为有用的,表示赞赏。祝你好运,玩得开心!你的解决方案很糟糕。如果你在另一个活动中使用该片段会发生什么?你需要工具栏做什么?我不会在另一个活动中使用该片段。那么你的解决方案是什么?我需要工具栏来挂起我的工具。我猜njzk2的问题是缺乏灵活性。IMHO,更大的问题是你正在像筛子一样泄漏内存。不要将小部件放在静态数据成员中。如果您想与宿主活动对话,您的片段可以调用getActivity()
并与实例对话,而不是与类对话,在实例上调用一些getToolbar()
。njzk2的问题可以通过将getActivity()
转换为某种接口来解决,而不是像MainActivity
这样的具体类,这样片段就不会绑定到特定的宿主活动类。