2017-01-25 6 views
0

У меня есть несколько действий и фрагментов. Я хотел бы установить панель инструментов в BaseActivity (поэтому установите ее только один раз). Но нужен доступ к панели инструментов из фрагмента (метод вроде - show, hide, changeTitle и т. Д.) Любое предложение?Панель инструментов в BaseActivity

Я попытался решение ниже, но когда я хочу, чтобы скрыть фрагмент, NPException показан

public abstract class BaseActivity extends AppCompatActivity { 

    Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(getLayoutResource()); 
    configureToolbar(); 
    } 

    protected abstract int getLayoutResource(); 

    private void configureToolbar() { 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    if (toolbar != null) { 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
    } 

public void hideToolbar() { 
    toolbar.setVisibility(View.GONE); 
} 

Моя активность

public class MyActivity extends BaseActivity() { 
} 

я называю hideToolbar в фрагменте, как:

public class MyFragment extends Fragment() { 

onCreate() { 

((Myactivity)getActivity).hideToolbar(); 
} 
+0

Добавьте более подробную информацию на ваш вопрос. Как вы вызываете метод 'hideToolbar' внутри вашего фрагмента ?. Как выглядит производная деятельность? Вы просто предоставили определение абстрактного класса, а не реализацию, так трудно ответить, где проблема – akash93

ответ

0

От фрагмента

getActivity().getSupportActionBar(); 
+0

панель инструментов всегда имеет значение null, когда я пытался что-то с – Stepan

0

Использование:

public abstract class BaseActivity extends AppCompatActivity { 

    private Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(getLayoutResource()); 
    configureToolbar(); 
    } 

    protected abstract int getLayoutResource(); 

    private void configureToolbar() { 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    // changes made here, try to find if getSupportActionBar() is null or not after setting it - setSupportActionBar 

    setSupportActionBar(toolbar); 
    if (getSupportActionBar() != null) { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
    } 

// How and where you calling this method ? 
public void hideToolbar() { 
    toolbar.setVisibility(View.GONE); 
} 
+0

добавить свой код ошибки также .. – W4R10CK

+0

теперь нет ошибки, но когда Я вызываю .hideToolbar, панель инструментов по-прежнему там – Stepan

+0

использовать в этом в 'MyFragment' ->' ((AppCompatActivity) getActivity()). GetSupportActionBar(). Hide(); ' – W4R10CK

2

меня включить что-то, как у вас в моем проекте. Это образец. Вы можете получить от нее ссылку.

BaseActivity.java класс:

public abstract class BaseActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(getLayoutResource()); 
    } 


    protected abstract int getLayoutResource(); 
} 

ToolBarActivity.java класс:

public abstract class ToolbarActivity extends BaseActivity { 
protected Toolbar toolbar; 


@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View contentView = findViewById(R.id.flToolbarContentContainer); 
    if (contentView instanceof ViewGroup) { 
     ((ViewGroup) contentView) 
       .addView(LayoutInflater.from(this) 
         .inflate(getToolbarLayoutResource() 
           , (ViewGroup) contentView, false)); 
    } 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
} 

@Override 
protected int getLayoutResource() { 
    return R.layout.activity_toolbar; 
} 

protected abstract int getToolbarLayoutResource(); 

public void showToolbar() { 
    toolbar.setVisibility(View.VISIBLE); 
} 

public void hideToolbar() { 
    toolbar.setVisibility(View.GONE); 
} 
} 

activity_toolbar.xml расположение файла:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rlToolbarContainer" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 


<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:layout_toLeftOf="@+id/pbToolbarActivity" 
    android:background="@color/blue_panel_day_background" 
    android:theme="@style/ToolbarTheme" /> 

<FrameLayout 
    android:id="@+id/flToolbarContentContainer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@id/toolbar" /> 
</RelativeLayout> 

MainActivity.java класс:

public class MainActivity extends ToolbarActivity { 

@Override 
protected int getToolbarLayoutResource() { 
    return R.layout.activity_main; 
} 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    homeFragment = HomeFragment.newInstance(); 
    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.llMainActivityContainer, homeFragment) 
      .commit(); 
} 
} 

activity_main.xml расположение файла:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/llMainActivityContainer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

</LinearLayout> 

Теперь в Fragment классе, применяются:

((ToolbarActivity) getActivity()).showToolbar(); 
((ToolbarActivity) getActivity()).hideToolbar(); 
+0

Что такое метод createNavbar? – Stepan

+0

Ohhhhhh !!! это метод для «навигационного ящика». Он там не нужен. –

0

Чтобы получить доступ к ActionBar из Fragment попробовать метод ниже

ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); 

Теперь вы можете доступ ко всем методам ActionBar