从片段访问工具栏(及其子项)?
Access Toolbar (and its children) from fragment?
我正在使用 v7.widget.Toolbar 组件构建应用程序。
我可以将工具栏添加到我的 activity,但我不知道如何(正确的方法是什么?)从 activity 的片段访问它.
这是工具栏
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
app:theme="@style/MainActionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
tools:context=".MainActivity">
<ImageView
android:background="@drawable/icon_1"
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:layout_marginLeft="19dp"
android:id="@+id/menu_1"
android:layout_gravity="center_vertical|left"
android:src="@drawable/menu_burger"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:layout_marginRight="19dp"
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:id="@+id/menu_2"
android:layout_gravity="center_vertical|right"
android:src="@drawable/icon_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
以下是我在 activity 中的使用方式:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/view_home_toolbar" />
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
...
...
</LinearLayout>
在我的 activity 的 onCreate 中:
Toolbar actionBar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(actionBar);
现在,例如,我想从片段中的工具栏访问“@id/menu_1”,我该怎么做?
getSupportActionBar() 给我 ActionBar,但我需要工具栏
提前致谢!
我不确定这是否有效,但你可以试试。
final AppCompatActivity act = (AppCompatActivity) getActivity();
if (act.getSupportActionBar() != null) {
Toolbar toolbar = (Toolbar) act.getSupportActionBar().getCustomView();
}
Toolbar 本质上是一个 ViewGroup。
这将为您完成工作
((MainAcivity)this.getActivity()).getToolbar();
Activity 和 Fragment 之间的通信(这同样适用于任何 Java 组件)应该通过接口完成。
针对你的情况定义一个接口
public interface IOperateOnToolbar {
//methods allowing to communicate with toolbar
public void setToolbarColor(Color c);
public void setImageView1Resource(int resID);
public void setImageView2Resource(int resID);
//.....
}
所以你有一个 Activity
public class MainActivity extends AppCompatActivity implements IOperateOnToolbar {
//onCreate, onDestroy ...
public void setToolbarColor(Color c) {
//implementation follows
}
public void setImageView1Resource(int resID) {
imageView1.setBackgroundResource(resID);
}
public void setImageView2Resource(int resID) {
imageView2.setBackgroundResource(resID);
}
}
还有你的片段
public class MyFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
IOperateOnToolbar toolbarCallback = (IOperateOnToolbar) getActivity();
}
}
使用接口在组件之间进行通信有以下好处:
如果将 "MainActivity" 替换为另一个("ActivityX",它也实现了 IOperateOnToolbar),则无需在 "MyFragment" 中编辑任何内容
"MyFragment" 只能访问由 IOperateOnToolbar 接口公开的那些方法。
请检查 this docu,其中 google 建议使用接口进行通信(片段之间,但原则上应该相同)。
在这里您可以访问工具栏子项:
TextView toolbarTextView = (TextView) ((MainActivity) this.getActivity()).findViewById(R.id.toolbarTitle);
toolbarTextView.setText("Hello");
无需编写大量代码:按照此操作
在 Kotlin 中:
var toolbar = activity.findViewById<Toolbar>(R.id.toolbar)
toolbar.setTitle("Rashid")
在Java中:
Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Rashid")
在我的例子中,我有一个 activity 和一个用其他片段替换此 activity 片段的导航抽屉。
如果您在主 activity 中实现工具栏视图(微调器、按钮..),
将在此 activity 中替换的片段可以看到工具栏并与其视图交互。
else 如果,你需要根据这个视图来处理动作,你可以使用:getActivity.findViewById();内部片段。
我正在使用 v7.widget.Toolbar 组件构建应用程序。
我可以将工具栏添加到我的 activity,但我不知道如何(正确的方法是什么?)从 activity 的片段访问它.
这是工具栏
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
app:theme="@style/MainActionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
tools:context=".MainActivity">
<ImageView
android:background="@drawable/icon_1"
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:layout_marginLeft="19dp"
android:id="@+id/menu_1"
android:layout_gravity="center_vertical|left"
android:src="@drawable/menu_burger"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:layout_marginRight="19dp"
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:id="@+id/menu_2"
android:layout_gravity="center_vertical|right"
android:src="@drawable/icon_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
以下是我在 activity 中的使用方式:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/view_home_toolbar" />
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
...
...
</LinearLayout>
在我的 activity 的 onCreate 中:
Toolbar actionBar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(actionBar);
现在,例如,我想从片段中的工具栏访问“@id/menu_1”,我该怎么做?
getSupportActionBar() 给我 ActionBar,但我需要工具栏
提前致谢!
我不确定这是否有效,但你可以试试。
final AppCompatActivity act = (AppCompatActivity) getActivity();
if (act.getSupportActionBar() != null) {
Toolbar toolbar = (Toolbar) act.getSupportActionBar().getCustomView();
}
Toolbar 本质上是一个 ViewGroup。
这将为您完成工作
((MainAcivity)this.getActivity()).getToolbar();
Activity 和 Fragment 之间的通信(这同样适用于任何 Java 组件)应该通过接口完成。
针对你的情况定义一个接口
public interface IOperateOnToolbar {
//methods allowing to communicate with toolbar
public void setToolbarColor(Color c);
public void setImageView1Resource(int resID);
public void setImageView2Resource(int resID);
//.....
}
所以你有一个 Activity
public class MainActivity extends AppCompatActivity implements IOperateOnToolbar {
//onCreate, onDestroy ...
public void setToolbarColor(Color c) {
//implementation follows
}
public void setImageView1Resource(int resID) {
imageView1.setBackgroundResource(resID);
}
public void setImageView2Resource(int resID) {
imageView2.setBackgroundResource(resID);
}
}
还有你的片段
public class MyFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
IOperateOnToolbar toolbarCallback = (IOperateOnToolbar) getActivity();
}
}
使用接口在组件之间进行通信有以下好处:
如果将 "MainActivity" 替换为另一个("ActivityX",它也实现了 IOperateOnToolbar),则无需在 "MyFragment" 中编辑任何内容
"MyFragment" 只能访问由 IOperateOnToolbar 接口公开的那些方法。
请检查 this docu,其中 google 建议使用接口进行通信(片段之间,但原则上应该相同)。
在这里您可以访问工具栏子项:
TextView toolbarTextView = (TextView) ((MainActivity) this.getActivity()).findViewById(R.id.toolbarTitle);
toolbarTextView.setText("Hello");
无需编写大量代码:按照此操作
在 Kotlin 中:
var toolbar = activity.findViewById<Toolbar>(R.id.toolbar)
toolbar.setTitle("Rashid")
在Java中:
Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Rashid")
在我的例子中,我有一个 activity 和一个用其他片段替换此 activity 片段的导航抽屉。 如果您在主 activity 中实现工具栏视图(微调器、按钮..), 将在此 activity 中替换的片段可以看到工具栏并与其视图交互。
else 如果,你需要根据这个视图来处理动作,你可以使用:getActivity.findViewById();内部片段。