【问题标题】:Android : Use fragment or change all the view in the activityAndroid:使用片段或更改活动中的所有视图
【发布时间】:2015-03-15 09:05:50
【问题描述】:

我请你对我的申请提出建议。我必须开发一个具有此特性的应用程序:

1- 仅纵向

2- 打开应用时会显示蓝牙设备

3- 当您点击一台设备时,应用会向用户询问解锁码并显示连接按钮

4- 按下连接按钮后,应用会显示一个带有两个或三个按钮的加载微调器栏

重点是:我为每种行为使用三个不同的片段是否更好?

现在我已经做到了:

扫描设备的一项活动

解锁码的一个活动

但我不知道我可以将加载屏幕(加载微调器栏和三个按钮)放在哪里

现在我正在考虑以不同的方式发展。一个处理 3 个不同片段加载的中心活动:

  1. 一个用于扫描设备

  2. 一个用于解锁码,一个用于加载屏幕

但我是Android编程新手,我总是想知道我的想法是正确的还是错误的。

最后:为了将所选设备从片段通信到活动,我想我将在 mainactivity 中实现一个侦听器。对吗?

****编辑:** *我对主要问题还有另一个疑问。***

现在根据您的建议,我想以这种方式开发此应用程序:

  • 主要活动

    • 扫描设备片段
    • 解锁设备片段

    • 加载片段

  • 在服务下启动

在之前的版本中,我想开发三个不同的活动,并使用 binder 和 messange 以双向方式与服务进行通信

现在,主要活动内部有三个不同的片段。我的问题是:对你来说,最好在 mainactivity 或每个片段中实现与服务的通信?

例如:用户在扫描片段中选择了一个设备,该片段将选择直接传递给服务或将选择传递给将信息转发给服务的 mainactivity?

感谢您的宝贵时间:)

【问题讨论】:

  • 你应该使用片段
  • 谢谢 :) 最后:为了将所选设备从片段通信到活动,我想我将在 mainactivity 中实现一个侦听器。对吗?
  • 在您的片段中创建一个接口,让您的活动实现该接口,您可以将片段中的信息传递给活动

标签: android performance android-fragments android-activity


【解决方案1】:

不要不要使用setContentView() 在应用程序的状态之间进行更改,这可能会导致onBackPressed() 上的不一致问题 - 请改用片段。但是您会在背压时遇到问题,因此您需要查看在背压时您的活动中是否有碎片,您需要在此问题中查看https://stackoverflow.com/a/24527530/2413303ContainerFragment。

    @Override
    public void onCreate(Bundle saveInstanceState)
    {
        super.onCreate(saveInstanceState);
        this.setContentView(R.layout.activity_container);
        if (saveInstanceState == null)
        {               
             getSupportFragmentManager().beginTransaction()
                .add(R.id.activity_container_container, new ExampleFragment())
                .addToBackStack(null)
             .commit();
        }
        getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener()
        {
            public void onBackStackChanged()
            {
                int backCount = getSupportFragmentManager().getBackStackEntryCount();
                if (backCount == 0)
                {
                    finish();
                }
            }
        });
    }

另外,使用 ButterKnife 库,我没有在这个例子中链接,即使我应该有。它使代码不那么冗长并且做同样的事情。

public class FancyFragment extends Fragment {
   @InjectView(R.id.button1) Button button1;
   @InjectView(R.id.button2) Button button2;

  @OnClick(R.id.btnSubmit)
  public void submit(View view) {
     // TODO submit data to server...
  }

  @Override 
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.fancy_fragment, container, false);
     ButterKnife.inject(this, view);
     // TODO Use "injected" views...
     return view;
  }
}

对于通信,您可以使用 Otto 库,如 https://stackoverflow.com/a/28480952/2413303

public class UpdateListEvent {

}

public class MainActivity extends ActionBarActivity {
    ...
    public void updatelist() {
       SingletonBus.INSTANCE.getBus().post(new UpdateListEvent());
    }
}

public class FragmentA extends Fragment {
    @Override
    public void onResume() {
        super.onResume();
        SingletonBus.INSTANCE.getBus().register(this);
    }

    @Override
    public void onPause() {
        SingletonBus.INSTANCE.getBus().unregister(this);
        super.onPause();
    }

    @Subscribe
    public void onUpdateListEvent(UpdateListEvent e) {
         //do things
    }
}

public enum SingletonBus {
    INSTANCE;

    private Bus bus;

    private SingletonBus() {
        this.bus = new Bus(ThreadEnforcer.ANY);
    }

    public Bus getBus() {
        return bus;
    }
}

【讨论】:

  • 对于这个应用程序我不能使用外部库(现在),将来我会很乐意使用你的建议(关于使用库):D 对于这个应用程序,我使用你的第一个建议 !!!感谢您的每一个建议:D
  • 哦。真可惜。片段活动通信的最佳选择是我上面链接的示例,然后 - 使用Callbacks。不过,您也可以使用LocalBroadcastManager
  • 我保存了你的帖子 :D 你很温柔 :) 谢谢!我在第一篇文章中添加了一个与主要问题相关的进一步问题。我做对了,或者我必须提出一个新问题?嗯
【解决方案2】:

我对主要问题还有另一个疑问。

现在我用这种方式开发这个应用程序:

  • 主要活动

    • 扫描设备片段
    • 解锁设备片段

    • 加载片段

  • 在服务下启动

在之前的版本中,我想开发三种不同的活动,并使用 binder 和 messange 以双向方式与服务进行通信

现在,main Activity 内部有三个不同的 Fragment,因为您最好在 mainactivity 内部或每个 Fragment 内部实现与服务的通信?

例如:

用户在扫描片段中选择一个设备,这个片段将选择直接传达给服务或将选择传达给将信息转发给服务的主要活动?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多