正直なところ、これは新参者を混乱させるためだけに行われていると感じざるを得ません。完全な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プラットフォームでの開発が容易になります。静的な内部クラスをフラグメントとして提供するという現在のアプローチにメリットはありますか?