2014-11-24 5 views
11

Używam najnowszego paska narzędzi z biblioteki AppCompatv7. Umieściłem widok tekstowy w grupie ToolBar ViewGroup i chcę ustawić tytuł w tym widoku tekstowym z fragmentu w mojej aktywności. W przypadku niestandardowy pasek akcji ((ActionBarActivity) getActivity) .setcustomView (..) zrobiłby to zadanie. Ale z powodu użycia tego paska narzędziowego nie jestem w stanie tego użyć. Również zaimplementowałem metodę w mojej BaseActivity, która jest dziedziczona przez all Activities.This BaseActivity zawiera moją metodę inicjalizacji przesuwnej szuflady po lewej. Muszę zainicjować metodę initDrawerLayout() w działaniu, inaczej szuflada nie zostanie zainicjalizowana. Jeśli zainicjuję ją w fragmencie, to daję wszystkie puste wyniki, ani przycisk przełączania szuflady, ani nie jest ustawiany niestandardowy tytuł.Ustaw Tytuł inToolBar z fragmentu w Androidzie

To jest mój kod initDrawer ..

public void initDrawerLayout(String toolbar_text) { 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerRelative = (RelativeLayout) findViewById(R.id.drawer_relative); 
     if (mDrawerLayout != null) { 
      findViewById(R.id.drawer_btn_a).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_b).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_c).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_d).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_e).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_f).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_g).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_h).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_i).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_j).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_k).setOnClickListener(this); 
      findViewById(R.id.drawer_btn_l).setOnClickListener(this); 
      findViewById(R.id.my_layout).setOnClickListener(this); 





      Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); 
      toolbar.setBackground(getResources().getDrawable(R.drawable.icn_actionbar_background)); 
      TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title); 
      mTitle.setText(toolbar_text); 
      mTitle.setTypeface(Typeface.DEFAULT_BOLD); 
      if (toolbar != null) { 
       setSupportActionBar(toolbar); 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      } 
      toolbar.setNavigationIcon(R.drawable.ic_drawer); 

      mDrawerToggle = new ActionBarDrawerToggle(
        this, mDrawerLayout, toolbar, 
        R.string.drawer_open, R.string.drawer_close 
       ); 
       mDrawerLayout.setDrawerListener(mDrawerToggle); 


      toolbar.setNavigationOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) { 
         mDrawerLayout.closeDrawer(Gravity.LEFT); 
        } else { 
         mDrawerLayout.openDrawer(Gravity.LEFT); 
        } 
       } 
      }); 
      mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, 
        GravityCompat.START); 

      mDrawerLayout.setScrimColor(getResources().getColor(
        android.R.color.transparent)); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      getSupportActionBar().setHomeButtonEnabled(true); 
      getSupportActionBar().setDisplayShowTitleEnabled(false); 

     } 
    } 

A to mój kod we fragmencie ..

((FirstActivity) getActivity()).initDrawerLayout(mFirst.name); gdzie mFirst jest obiekt klasy Osoba

i kodu paska narzędzi.

<android.support.v7.widget.Toolbar 
      android:id="@+id/my_awesome_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:minHeight="?attr/actionBarSize"> 
      <TextView 
       android:id="@+id/toolbar_title" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:gravity="center" 
       android:text="Toolbar Title" 
       android:textColor="@color/action_text-color" 
       android:textSize="18sp" 
       android:textStyle="bold" /> 

      </android.support.v7.widget.Toolbar> 

Pomóżcie chłopaki ..

+5

Kto głosował na dół this..can proszę odpowiedzieć na pytanie zanim downvoting..I zadałem to pytanie po dość wielu poszukiwaniach. – AndroidMech

Odpowiedz

6

Aby pozwolić fragmentowi komunikować się z jego działaniem (aby ustawić swój tytuł paska narzędzi), możesz zdefiniować interfejs w klasie Fragment i zaimplementować go w ramach działania w sposób opisany tutaj: Communicating with Other Fragments.

1

można zmienić tytuł na pasku narzędzi na zdarzenia OnAttach, coś takiego

 var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar); 
     toolbar.Title = "New Title"; 
19

Robię to tak: z połączenia fragmentów

getActivity().setTitle("your title"); 

Ponadto można wywołać dowolną Funkcja twojego rodzica Aktywność taka jak ta:

YourActivity mYourActiviy = (YourActivity) getActivity(); 
mYourActivity.yourActivityFunction(yourParameters); 
+5

[dlaczego to nie zadziała!] (Http://stackoverflow.com/a/26998718/3182574) –

+0

TO DZIAŁA! Dziękuję ... –

2

Odpowiedź jest pisana poniżej w metodzie fragmentów oncreateview.

getActivity().setTitle("your name"); 
0

W swoim działaniu zadeklaruj pasek narzędzi jako publiczny.

public class YourActivity : Activity 
{ 
    public Toolbar toolbar; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     toolbar = .... // initilize your toolbar 
    } 
} 

Następnie z fragmentem

((YourActivity) getActivity()).toolbar.Title = "Your Title"; 
1

Jeśli używasz niestandardowego paska narzędzi, to pomoże Ci:

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
toolbar.setTitle("Feedback"); 
+2

Podczas gdy ten kod może odpowiedzieć na pytanie, podanie dodatkowego kontekstu dotyczącego _how_ i/lub _why_ go rozwiązuje problem, poprawi długoterminową wartość odpowiedzi. –

1

Musisz ustawić tytuł aktywności popełnienia fragment i zwróć ten fragment: To działa dla mnie.

1

Jeśli ktoś zmaga się z tym problemem, może to być przydatne.

Zasadniczo masz 4 opcje, jak sobie z tym poradzić:

  • korzystanie z interfejsu w celu komunikowania się ze swojej działalności, lub innym dogodnym sposobem, jak autobus zdarzeń.
  • dzwonisz pod numer getActivity().setTitle("Title"), ale w takim przypadku musisz podłączyć swój Toolbar do ActionBar, dzwoniąc pod numer setSupportActionBar() w swojej działalności.
  • Możesz mieć publiczną instancję swojego Toolbar i uzyskać dostęp do tej instancji z fragmentu.
  • Wreszcie, jeśli potrzebujesz instancję swojej Toolbar (może chcesz zrobić coś innego z), można po prostu dostać się to w ten sposób:

    Toolbar bar=Toolbar.class.cast(getActivity().findViewById(R.id.toolbar));

dobrze, ostatniej opcji rozwiązałoby problem tylko wtedy, gdy Toolbar nie został przekazany do metody setSupportActionBar.

Jeśli to było, to trzeba wywołać tę metodę w swojej działalności:

supportActionBar.setDisplayShowTitleEnabled(false),

który rozwiąże ten problem.

Chciałbym jednak zasugerować użycie ButterKnife co pozwoli trochę czystsze, oto przykład:

Toolbar actionBar=findById(getActivity(),R.id.actionBar); 
    actionBar.setTitle("Title"); 
1
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
      @Override 
      public void onBackStackChanged() { 
       FragmentManager.BackStackEntry lastBackStackEntry=null; 

       int lastBackStackEntryCount = getSupportFragmentManager().getBackStackEntryCount() - 1; 
       if(lastBackStackEntryCount >= 0) 
       { 
        lastBackStackEntry = getSupportFragmentManager().getBackStackEntryAt(lastBackStackEntryCount); 
       } 
       Toast.makeText(MainActivity.this, ""+lastBackStackEntryCount, Toast.LENGTH_SHORT).show(); 
       if(lastBackStackEntryCount == -1) 
       { 
        toolbar.setTitle(""); 
        toolbar.setLogo(R.drawable.header_logo); 
       } 
       else 
       { 
        toolbar.setTitle(lastBackStackEntry.getName()); 
       } 
      } 
     }); 
+0

to zajmie się również problemem pierwszego fragmentu –

+0

, co pomoże w załadowaniu tytułu z samego znacznika backstack, więc wystarczy podać poprawną nazwę znacznika, a także tytuł fragmentu. –

0

xml

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar_detail" 
    android:layout_width="match_parent" 
    android:layout_height="55dp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    app:contentInsetStart="0dp" 
    app:contentInsetStartWithNavigation="0dp" 
    android:background="@color/tool_bar_color"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:gravity="center"> 


     <TextView 
      android:id="@+id/toolbar_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:textColor="#fff" 
      android:textSize="16sp" /> 




    </LinearLayout> 
</android.support.v7.widget.Toolbar> 

Znajdź TextView Id z paska

jeśli używasz A ctivity

TextView mTitle = (TextView)findViewById(R.id.toolbar_title); 
mTitle.setText("set your title"); 

jeśli useing Fragment

TextView mTitle = (TextView) view.findViewById(R.id.toolbar_title); 
mTitle.setText("set your title"); 
+0

Prosimy nie publikować zduplikowanych odpowiedzi na wiele pytań. Twoje odpowiedzi powinny być dostosowane do każdego konkretnego pytania, a pytania, które są takie same, powinny być oflagowane jako duplikaty. – meagar

1

ta praca dla mnie:

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.id_toolbar); 

toolbar.setTitle("New Title");