带有多个片段的活动中的 FloatingActionButton?
Posted
技术标签:
【中文标题】带有多个片段的活动中的 FloatingActionButton?【英文标题】:FloatingActionButton in Activity with multiple Fragments? 【发布时间】:2017-06-08 14:10:16 【问题描述】:我有一个似乎无法解决的问题。
我有一个包含列表片段(横向和纵向)和 addItem 片段的活动。
Activity 上有一个 FloatingActionButton,但我似乎不知道如何设置它的 onClickListener。
getViewById 始终返回 null,因此 setOnClickListener 没有可调用的对象。为什么会这样,我该如何解决?
我做错了多个片段,这是我的问题吗?
注意:为简洁起见,我省略了景观片段/布局。和头像一样,id不同。
MainActivity.java
package tlw.app;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity
ArrayList<String> activeFragments = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setContentView(R.layout.fragment_list);
FragmentManager fManager = getFragmentManager();
FragmentTransaction fTrans = fManager.beginTransaction();
Configuration configInfo = getResources().getConfiguration();
activeFragments.clear();
if(configInfo.orientation == Configuration.ORIENTATION_LANDSCAPE)
ListFragmentLand fragmentListLand = new ListFragmentLand();
fTrans.replace(R.id.main_container, fragmentListLand);
activeFragments.add("list_land");
else
ListFragment fragmentListPort = new ListFragment();
fTrans.replace(R.id.main_container, fragmentListPort);
activeFragments.add("list_port");
fTrans.commit();
if (activeFragments.contains("list_port") || activeFragments.contains("list_land"))
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
FragmentManager fManager = getFragmentManager();
FragmentTransaction fTrans = fManager.beginTransaction();
activeFragments.clear();
ItemAddFragment fragmentAdd = new ItemAddFragment();
fTrans.replace(R.id.main_container, fragmentAdd);
activeFragments.add("add");
fTrans.commit();
);
activity_main.xml
<android.support.design.widget.AppBarLayout
android:layout_
android:layout_
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_
android:layout_
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_
android:layout_
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@android:drawable/ic_dialog_email" />
<FrameLayout
android:id="@+id/main_container"
android:layout_
android:layout_
/>
</android.support.design.widget.CoordinatorLayout>
ListFragment.xml
package tlw.app;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class ListFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
return inflater.inflate(R.layout.fragment_list, container, false);
fragment_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_list"
android:layout_
android:layout_
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="tlw.app.MainActivity"
tools:showIn="@layout/activity_main"
android:orientation="vertical">
<TextView
android:id="@+id/text_view"
android:layout_
android:layout_
android:text="List Portrait"/>
</LinearLayout>
ItemAddFragment.java
package tlw.app;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class ItemAddFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
return inflater.inflate(R.layout.fragment_add, container, false);
fragment_add.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_add"
android:orientation="vertical"
android:layout_
android:layout_>
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<TextView
android:id="@+id/textView_name"
android:layout_
android:layout_
android:text="Name:"
/>
<EditText
android:layout_
android:layout_
android:id="@+id/editText_name"
/>
</LinearLayout>
</LinearLayout>
【问题讨论】:
我建议创建一个新的 Android Studio 项目并构建一个简单的示例来说明您想要做什么。使用单个片段和 FAB 创建单个活动。将 OnClickListener 添加到 FAB。你能让那么多东西正常工作吗? 在您的实际应用程序中,您似乎有两种不同的布局:一种带有 FAB,另一种没有。您可以通过创建两个不同的活动来大大简化您的代码。这将避免所有复杂的 if 语句。 您还应该使用不同的layout-*
文件夹而不是Java 代码来支持不同的屏幕方向。
我之前用 FAB 构建了一个项目,并让它正常工作。主活动布局包含 FAB。我希望它出现在所有片段上,所以我认为这是放置它的最佳位置。
if (activeFragments.contains("list_port") || activeFragments.contains("list_land"))
的目的是什么?
【参考方案1】:
请更改MainActivity
中的这部分代码
来自
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setContentView(R.layout.fragment_list);
到
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
错误::
--传递错误的xml实例::
--在实际设置xml之前尝试获取工具栏..
如果需要更多帮助,请告知
【讨论】:
【参考方案2】:setContentView(R.layout.fragment_list);
这将设置用于没有 FAB 的活动的布局。将此行更改为
setContentView(R.layout.activity_main);
一般来说,每当findViewById()
返回null
时,您需要确保加载了正确的XML 并且它包含您要查找的id
。
【讨论】:
这解决了问题!我仍然有一些片段没有显示我想要的方式的问题,但我想我可以解决这些问题。谢谢!以上是关于带有多个片段的活动中的 FloatingActionButton?的主要内容,如果未能解决你的问题,请参考以下文章