新しいADTがデフォルトで静的内部クラスFragmentを作成するのはなぜですか?


8

正直なところ、これは新参者を混乱させるためだけに行われていると感じざるを得ません。完全なAndroid初心者によるStack Overflowのエラーのほとんどは、ほとんどの場合、静的内部クラスFragmentがあり、それがどのように機能するか、なぜそこにあるのかを理解しておらず、アクティビティを完全には理解していませんが、アクティビティを使用しようとしています何が起こっているかの背後にある概念。

認めざるを得ません。 "PlaceholderFragment"のアプローチも理解できず、静的内部クラスの使用はまったく拡張できません。あなたがしなければならない最初のことは実際のクラスを外で作成することです-しかし、なぜ初心者はそれをしなければならないのですか?

次の単純なフラグメントベースのandroidプロジェクト構造に似たプロジェクト構造を使用した場合、これははるかに効率的であると思います。

  • src
    • 全パッケージ名
      • アクティビティ
        • 主な活動
      • 断片
        • FirstFragment
        • SecondFragment
  • 解像度
    • レイアウト
    • ...

のコードで

src / wholepackagename / activity / MainActivity:

public class MainActivity extends FragmentActivity implements FirstFragment.Callback
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener()
        {
            public void onBackStackChanged()
            {
                int backCount = getSupportFragmentManager().getBackStackEntryCount();
                if (backCount == 0)
                {
                    finish();
                }
            }
        });

        if (savedInstanceState == null)
        {
            getSupportFragmentManager().beginTransaction().add(R.id.main_container, new FirstFragment()).addToBackStack(null).commit();
        }
    }

    @Override
    public void firstFragmentCallback()
    {
        getSupportFragmentManager().beginTransaction().replace(R.id.main_container, new SecondFragment()).addToBackStack(null).commit();
    }
} 

src / wholepackagename / fragment / FirstFragment.java:

public class FirstFragment extends Fragment implements View.OnClickListener
{
    private Callback callback;

    private Button firstFragmentButton;

    public static interface Callback
    {
        void firstFragmentCallback();
    }

    public FirstFragment()
    {
        super();
    }

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        try
        {
            callback = (Callback) activity;
        }
        catch (ClassCastException e)
        {
            Log.e(getClass().getSimpleName(), activity.getClass().getSimpleName() + " must implement Callback interface!", e);
            throw e;
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_first, container, false);
        firstFragmentButton = (Button) rootView.findViewById(R.id.fragment_first_button);
        firstFragmentButton.setOnClickListener(this);
        return rootView;
    }

    @Override
    public void onClick(View v)
    {
        if(v == firstFragmentButton)
        {
            callback.firstFragmentCallback();
        }
    };
}

src / wholepackagename / fragment / SecondFragment.java:

public class SecondFragment extends Fragment implements View.OnClickListener
{
    private Button secondFragmentButton;

    public SecondFragment()
    {
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_second, container, false);
        secondFragmentButton = (Button) rootView.findViewById(R.id.fragment_second_button);
        secondFragmentButton.setOnClickListener(this);
        return rootView;
    }

    @Override
    public void onClick(View v)
    {
        if(v == secondFragmentButton)
        {
            Toast.makeText(getActivity(), "This is an example!", Toast.LENGTH_LONG).show();
        }
    };
}

Android-Manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="wholepackagename"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="wholepackagename.activity.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

res / layout / activity_main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

res / layout / fragment_first.xml:

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

    <Button
        android:id="@+id/fragment_first_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" 
        android:text="@string/first_button" />

</RelativeLayout>

res / layout / fragment_second.xml:

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

    <Button
        android:id="@+id/fragment_second_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/second_button" />

</RelativeLayout>

res / values / strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Application name</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="first_button">First Button</string>
    <string name="second_button">Second Button</string>
</resources>



私にとって、静的内部クラスFragmentは実際にはどのような保守性もサポートしていないようで、何が起こっているのかを理解するのは難しく、アクティビティとフラグメント(フラグメントとロジックの表示)が一緒に混ぜると、初心者が見たり監督したりするのが難しくなります。

上記のような例があると、Androidプラットフォームでの開発が容易になります。静的な内部クラスをフラグメントとして提供するという現在のアプローチにメリットはありますか?


2
昨日自分に尋ねた
Mirco 14

回答:


1

私と他の人々は、フラグメントはかなり奇妙であり、Good Things™として盲目的に受け入れられるべきではないというあなたの感情を共有します。

ブートストラップコード内での存在の背後にある意図は、フラグメントをできるだけ早く開発者の顔の前に投げることであると常に思っていました。Fragmentsはバージョン1から存在していなかったので、より多くの人々を参加させるためには、Googleが導入にいくらか重きを置く必要があると感じたと思います。しかし、私は推測することしかできません。


WTFs/min = 2^fragment count corner.squareup.com/2014/10/...
ロヴィス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.