简体   繁体   中英

setTitle of collapsing toolbar in other method where it is initialized

In my Fragment I have a CollapsingToolbar and it is created it in the onCreateView() method:

@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;
}

Since my title can change in other methods, I tried to create a new method that shall set a new Title of the CollapsingToolbar, but it says cannot resolve symbol 'collapsingToolbarLayout' . I tried it like this:

public void setTitle(String passedTitle){
    collapsingToolbarLayout.setTitle(passedTitle);
}

What do I have to change so I can rename the title from other methods?

Edit:

This is the class where I use the setTitle() method. I try to use it from an inner Class, I tried to cut it as well as possible:

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);
}
}

}

And the 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);
}

}

Root cause: Because the collapsingToolbarLayout variable is local in onCreate method, that why setTitle cannot access it.

Solution: Make collapsingToolbarLayout as a variable of your Fragment.

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);
}

Update: I see the problem, change the code in CallsFragment

From

collapsingToolbarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.toolbar_layout);
AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appBar);

To

collapsingToolbarLayout = (CollapsingToolbarLayout) view.findViewById(R.id.toolbar_layout);
AppBarLayout appBarLayout = (AppBarLayout) view.findViewById(R.id.appBar);

Note: When you want to access a view from activity that contains current fragment you can use.

View view = getActivity().findViewById(R.id.this_view_inside_activity);

If you want to access a view inside the fragment then use.

// 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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM