java - setTitle 在其他初始化方法中折叠工具栏
问题描述
在我的片段中,我有一个 CollapsingToolbar,它是在onCreateView()
方法中创建的:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.toolbar_layout);
AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appBar);
return view;
}
由于我的标题可以在其他方法中更改,我尝试创建一个新方法来设置 CollapsingToolbar 的新标题,但它显示cannot resolve symbol 'collapsingToolbarLayout'
. 我试过这样:
public void setTitle(String passedTitle){
collapsingToolbarLayout.setTitle(passedTitle);
}
我必须更改什么才能从其他方法重命名标题?
编辑:
这是我使用该setTitle()
方法的类。我尝试从内部类中使用它,我试图尽可能地削减它:
public class CallsFragment extends Fragment {
String title;
private CollapsingToolbarLayout collapsingToolbarLayout;
public CallsFragment() {
// 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.fragment_calls, container, false);
collapsingToolbarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.toolbar_layout);
AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appBar);
return view;
}
public void setTitle(String passedTitle){
collapsingToolbarLayout.setTitle(passedTitle);
}
public class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... arg0) {
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//here the title string gets filled
Log.d("place", title);
setTitle(title);
}
}
}
和 MainActivity:
public class MainActivity extends AppCompatActivity implements Serializable {
private ViewPager viewPager;
BottomNavigationView bottomNavigationView;
ChatFragment chatFragment;
CallsFragment callsFragment;
ContactsFragment contactsFragment;
MenuItem prevMenuItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initializing viewPager
viewPager = (ViewPager) findViewById(R.id.viewpager);
//Initializing the bottomNavigationView
bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_umkreis:
viewPager.setCurrentItem(0);
break;
case R.id.navigation_karte:
viewPager.setCurrentItem(1);
break;
case R.id.navigation_einstellungen:
viewPager.setCurrentItem(2);
break;
}
return false;
}
});
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (prevMenuItem != null) {
prevMenuItem.setChecked(false);
}
else
{
bottomNavigationView.getMenu().getItem(0).setChecked(false);
}
Log.d("page", "onPageSelected: "+position);
bottomNavigationView.getMenu().getItem(position).setChecked(true);
prevMenuItem = bottomNavigationView.getMenu().getItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
setupViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
callsFragment = new CallsFragment();
chatFragment = new ChatFragment();
contactsFragment = new ContactsFragment();
adapter.addFragment(callsFragment);
adapter.addFragment(chatFragment);
adapter.addFragment(contactsFragment);
viewPager.setAdapter(adapter);
int limit = adapter.getCount();
viewPager.setOffscreenPageLimit(limit);
}
}
解决方案
根本原因:因为collapsingToolbarLayout
变量在onCreate
方法中是本地的,那为什么setTitle
不能访问它。
解决方案:collapsingToolbarLayout
作为片段的变量。
private CollapsingToolbarLayout collapsingToolbarLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
collapsingToolbarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.toolbar_layout);
AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appBar);
return view;
}
public void setTitle(String passedTitle){
collapsingToolbarLayout.setTitle(passedTitle);
}
更新:我看到了问题,更改CallsFragment中的代码
从
collapsingToolbarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.toolbar_layout);
AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appBar);
到
collapsingToolbarLayout = (CollapsingToolbarLayout) view.findViewById(R.id.toolbar_layout);
AppBarLayout appBarLayout = (AppBarLayout) view.findViewById(R.id.appBar);
注意:当您想从包含当前片段的活动中访问视图时,您可以使用。
View view = getActivity().findViewById(R.id.this_view_inside_activity);
如果要访问片段内的视图,请使用。
// Inflate the layout for this fragment
View fragmentRootView = inflater.inflate(R.layout.fragment_calls, container, false);
View view = fragmentRootView.findViewById(R.id.this_view_inside_fragment);
推荐阅读
- c - 用于随机数和 64 位无符号整数乘法的 MATLAB 线性同余生成器 (LCG)
- python - 如何添加图形字符串值的标签,例如第一层第二层第三而不是层号
- python - SQL 查询在 {key:value} 对中返回缺少键(列名)的元组输出
- javascript - 获取带有表单数据的请求以进行身份验证反应
- php - 带有切换复选框的 Laravel 提交表单
- swift - 创建一个无窗口的 SwiftUI macOS 应用程序?
- javascript - ReactNative 在用户打开页面时重新渲染组件
- reactjs - GraphQL AppSync 的自动生成的变异输入中缺少对象字段
- java - 将 lambda 对象的引用传递给另一个类方法导致 Java 中的 NullPointerException
- python - 修改嵌套递归中的元组元素以进行就地更新